from __future__ import annotations
from typing import Dict, List
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse
from app.web.deps import templates, sb, _current_map_by_person_source, _normalize_name

router = APIRouter()

@router.get("/sync/batch/{batch_id}", response_class=HTMLResponse)
async def sync_batch(request: Request, batch_id: str):
    st = sb.table("staging_gov_staff").select("*").eq("batch_id", batch_id).order("staging_id").execute().data or []
    cand_rows = sb.table("match_candidates").select("*")\
        .eq("batch_id", batch_id).order("staging_id").order("score", desc=True).limit(10000).execute().data or []
    dec_rows = sb.table("match_decisions").select("*").eq("batch_id", batch_id).execute().data or []
    dec_by_staging = {r["staging_id"]: r for r in dec_rows}
    cur_map = _current_map_by_person_source()

    cands_by_st: Dict[int, list] = {}
    for c in cand_rows:
        cands_by_st.setdefault(c["staging_id"], []).append(c)

    rows_pending, rows_auto = [], []
    for s in st:
        staging_id = s["staging_id"]
        src = s.get("source")
        dec = dec_by_staging.get(staging_id)

        same_name = []
        for c in cands_by_st.get(staging_id, []):
            pid = c.get("candidate_person_id")
            prev = cur_map.get((pid, src))
            if _normalize_name((prev or {}).get("name")) == _normalize_name(s.get("name")):
                same_name.append({
                    "person_id": pid, "score": c.get("score"),
                    "prev_ctx": prev, "name": (prev or {}).get("name") or "-"
                })

        item = {"staging": s, "candidates": same_name, "decision": dec}
        if dec and dec.get("decision") == "AUTO": rows_auto.append(item)
        else: rows_pending.append(item)

    confirmed_events = sb.table("gov_staff_events").select("*").eq("batch_id", batch_id).order("event_id").execute().data or []
    total = len(st); cnt_pending = len(rows_pending); cnt_auto = len(rows_auto)

    return templates.TemplateResponse("sync/batch.html", {
        "request": request, "batch_id": batch_id,
        "cards": {"total": total, "pending": cnt_pending, "auto": cnt_auto},
        "rows_pending": rows_pending, "rows_auto": rows_auto,
        "events": confirmed_events,
    })
