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

router = APIRouter()

# person key utilities imported from deps (motie_person_keys)

DEPT_ORDER = [
    "장관실","제1차관","기획조정실","정책기획관","혁신행정담당관",
    "제2차관","에너지정책실","전력정책관","전력산업정책과",
    "원전산업정책국","원전산업정책과","원전환경과","원전지역협력과",
    "원전전략기획관","원전수출진흥과","원전수출협력과",
]
EXPECTED_POS: Dict[str, str] = {
    "장관실":"장관","제1차관":"1차관","기획조정실":"실장","정책기획관":"국장","혁신행정담당관":"과장",
    "제2차관":"2차관","에너지정책실":"실장","전력정책관":"국장","전력산업정책과":"과장",
    "원전산업정책국":"국장","원전산업정책과":"과장","원전환경과":"과장","원전지역협력과":"과장",
    "원전전략기획관":"국장","원전수출진흥과":"과장","원전수출협력과":"과장",
}
PHONE_ROLE_LAST4 = [
    ("장관실","5003","비서실장"),
    ("장관실","5005","수행비서"),
    ("장관실","5000","주무관"),
    ("제1차관","5016","주무관"),
    ("기획조정실","5201","주무관"),
    ("제2차관","5022","주무관"),
    ("에너지정책실","5701","주무관"),
    ("전력산업정책과","3925","사무관"),
    ("전력산업정책과","3890","사무관"),
]

def _last4(phone: str | None) -> str | None:
    if not phone: return None
    m = re.search(r"(\d{4})\s*$", str(phone))
    return m.group(1) if m else None

@router.get("/gov/motie/kps", response_class=HTMLResponse)
async def gov_motie_heads_kps(request: Request):
    try:
        res = (
            sb.table("motie_kps")  # ← 뷰: 선별 완료본
              .select("department,position,name,phone,task")
              .in_("department", DEPT_ORDER)
              .limit(10000)
              .execute()
        )
        raw: List[Dict] = res.data or []
    except Exception:
        raw = []

    by_dep: Dict[str, List[Dict]] = {}
    by_dep_pos: Dict[tuple, List[Dict]] = {}
    by_dep_l4: Dict[tuple, List[Dict]] = {}
    for r in raw:
        dep = (r.get("department") or "").strip()
        pos = (r.get("position") or "").strip()
        l4  = _last4((r.get("phone") or "").strip())
        by_dep.setdefault(dep, []).append(r)
        if pos:
            by_dep_pos.setdefault((dep, pos), []).append(r)
        if l4:
            by_dep_l4.setdefault((dep, l4), []).append(r)

    def pick_best(rows: List[Dict]) -> Dict:
        rows = rows or []
        rows.sort(key=lambda x: (0 if (x.get("name") or "").strip() else 1, (x.get("name") or "")))
        return rows[0] if rows else {}

    groups: List[Dict] = []
    for dep in DEPT_ORDER:
        rows_for_dep: List[Dict] = []

        leader_pos = EXPECTED_POS.get(dep, "-")
        leader_row = pick_best(by_dep_pos.get((dep, leader_pos), []))
        if leader_row:
            rows_for_dep.append({
                "pos": leader_pos,
                "name": (leader_row.get("name") or "-").strip() or "-",
                "phone": (leader_row.get("phone") or "-").strip() or "-",
                "task": (leader_row.get("task") or "-").strip() or "-",
                "person_key": motie_person_keys(
                    (leader_row.get("name") or "").strip() or None,
                    None if (leader_row.get("phone") or "-").strip()== '-' else (leader_row.get("phone") or '').strip(),
                    dep,
                    leader_pos,
                ).get("display"),
            })
        else:
            rows_for_dep.append({"pos": leader_pos, "name": "(공석)", "phone": "-", "task": "-"})

        for d, l4, role in PHONE_ROLE_LAST4:
            if d != dep:
                continue
            matches = list(by_dep_l4.get((dep, l4), []))
            if dep == "장관실" and l4 == "5000":
                matches = [m for m in matches if (m.get("position") or "").replace(" ","") != "장관"]
                if matches:
                    matches.sort(key=lambda x: ((x.get("name") or "") == "", (x.get("name") or "")))
                    for m in matches:
                        rows_for_dep.append({
                            "pos": role,
                            "name": (m.get("name") or "-").strip() or "-",
                            "phone": (m.get("phone") or "-").strip() or "-",
                            "task": (m.get("task") or "-").strip() or "-",
                            "person_key": motie_person_keys(
                                (m.get("name") or "").strip() or None,
                                None if (m.get("phone") or "-").strip()== '-' else (m.get("phone") or '').strip(),
                                dep,
                                role,
                            ).get("display"),
                        })
                else:
                    rows_for_dep.append({"pos": role, "name": "(공석)", "phone": "-", "task": "-"})
                continue

            m = pick_best(matches)
            if m:
                rows_for_dep.append({
                    "pos": role,
                    "name": (m.get("name") or "-").strip() or "-",
                    "phone": (m.get("phone") or "-").strip() or "-",
                    "task": (m.get("task") or "-").strip() or "-",
                    "person_key": motie_person_keys(
                        (m.get("name") or "").strip() or None,
                        None if (m.get("phone") or "-").strip()== '-' else (m.get("phone") or '').strip(),
                        dep,
                        role,
                    ).get("display"),
                })
            else:
                rows_for_dep.append({"pos": role, "name": "(공석)", "phone": "-", "task": "-"})

        groups.append({"department": dep, "rows": rows_for_dep})

    return templates.TemplateResponse("gov/motie/kps.html", {
        "request": request, "groups": groups,
    })
