from __future__ import annotations
from typing import Any, Dict, List, Optional
from fastapi import APIRouter, Request, Query
from fastapi.responses import HTMLResponse
from app.web.deps import templates, sb

router = APIRouter()

FIELDS = ["department","position","name","phone","task"]

def _safe_get(d: Dict[str, Any] | None, k: str) -> str:
    if not d:
        return ""
    v = d.get(k)
    return v if isinstance(v, str) else ("" if v is None else str(v))

@router.get("/gov/diff", response_class=HTMLResponse)
async def gov_diff(
    request: Request,
    src: str = Query(default="all"),
    q: str = Query(default=""),
    limit: int = Query(default=200, ge=10, le=2000),
):
    rows: List[Dict[str, Any]] = []
    try:
        qb = sb.table("gov_staff_events").select("*")
        if src in ("MOTIE","MOEF","ME"):
            qb = qb.eq("source", src)
        # 최신순 정렬(존재하는 컬럼에 따라 유연 처리)
        try:
            qb = qb.order("id", desc=True)
        except Exception:
            try:
                qb = qb.order("created_at", desc=True)
            except Exception:
                qb = qb.order("batch_id", desc=True)
        qb = qb.limit(limit)
        data = qb.execute().data or []
        if q:
            key = q.strip().lower()
            def hit(r):
                prev = (r.get("prev") or {})
                nxt = (r.get("next") or {})
                texts = [prev.get("name"), prev.get("department"), nxt.get("name"), nxt.get("department")]
                return any((key in (t or "").lower()) for t in texts)
            rows = [r for r in data if hit(r)]
        else:
            rows = data
    except Exception:
        rows = []

    # 전처리: 변경 필드 목록/표시 문자열 생성
    out = []
    for r in rows:
        prev = r.get("prev") or {}
        nxt = r.get("next") or {}
        changed = []
        for f in FIELDS:
            if _safe_get(prev, f) != _safe_get(nxt, f):
                changed.append(f)
        r["_changed"] = changed
        out.append(r)

    return templates.TemplateResponse("gov/diff.html", {
        "request": request,
        "src": src,
        "q": q,
        "rows": out,
        "FIELDS": FIELDS,
    })

