"""
CSRF Token API Endpoint (Phase 20)
==================================
提供 CSRF Token 給前端，用於保護敏感操作。

端點:
- GET /api/v1/csrf/token - 取得 CSRF Token

前端使用流程:
1. 頁面載入時呼叫 GET /api/v1/csrf/token
2. 將返回的 token 儲存在 state 或 memory 中
3. 敏感請求 (sign/reject) 時帶上 X-CSRF-Token header

建立日期: 2026-03-28 (台北時間)
建立者: Claude Code (首席架構師)
"""

from fastapi import APIRouter, Response

from src.core.csrf import CSRF_COOKIE_NAME, generate_csrf_token, set_csrf_cookie
from src.core.logging import get_logger
from src.models.csrf import CSRFTokenResponse

router = APIRouter(prefix="/csrf", tags=["Security"])
logger = get_logger("awoooi.csrf")


@router.get(
    "/token",
    response_model=CSRFTokenResponse,
    summary="取得 CSRF Token",
    description="取得用於保護敏感操作的 CSRF Token。Token 同時設定在 Cookie 和 Response Body 中。",
)
async def get_csrf_token(response: Response) -> CSRFTokenResponse:
    """
    取得 CSRF Token

    此端點會:
    1. 生成新的 CSRF Token
    2. 設定 awoooi_csrf_token Cookie
    3. 在 Response Body 中返回 Token

    前端應:
    1. 呼叫此端點取得 Token
    2. 在敏感請求中帶上 X-CSRF-Token header

    Returns:
        CSRFTokenResponse: 包含 CSRF Token 的回應
    """
    token = generate_csrf_token()
    set_csrf_cookie(response, token)

    logger.info(
        "csrf_token_issued",
        token_preview=token[:8] + "...",
    )

    return CSRFTokenResponse(
        token=token,
        cookie_name=CSRF_COOKIE_NAME,
        header_name="X-CSRF-Token",
    )
