"""
AI SLO REST API
===============
ADR-087 Phase 6 自我治理閉環 — AI 決策品質 SLO 查詢端點

Endpoints:
  GET /api/v1/ai/slo  — 取得最新 SLO 計算結果（含 Redis 快取）

設計原則:
- 優先讀 Service 層快取（TTL 5min），快取失效才重算
- 計算失敗 → 保守回傳 any_violated=True（由 AiSloCalculator 處理）
- 強制重算：?force_refresh=true
- Router 層不直接存取 Redis（leWOOOgo 積木化鐵律）

2026-04-15 ogt + Claude Sonnet 4.6（亞太）: Phase 6 初始建立
"""

from __future__ import annotations

import structlog
from fastapi import APIRouter, Query

from src.services.ai_slo_calculator import AiSloCalculator

logger = structlog.get_logger(__name__)

router = APIRouter()


@router.get("/ai/slo")
async def get_ai_slo(
    force_refresh: bool = Query(False, description="忽略快取，強制重算"),
) -> dict:
    """
    取得 AI 決策品質 SLO 最新結果。

    優先讀 Redis 快取（TTL 5min）；force_refresh=true 則強制重算並更新快取。

    Response:
        calculated_at   ISO 時間戳
        window_days     計算視窗（天）
        any_violated    是否有任何 SLO 違反
        cache_hit       是否命中快取
        metrics[]       三大 SLO 指標明細
    """
    calc = AiSloCalculator()

    if not force_refresh:
        cached = await calc.get_cached_report()
        if cached:
            data = cached.to_dict()
            data["cache_hit"] = True
            return data

    report = await calc.run()
    data = report.to_dict()
    data["cache_hit"] = False
    return data
