from __future__ import annotations
from typing import Any, Dict, List, Tuple
import hashlib
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse
from app.web.deps import templates, sb, logger
import json
from collections import Counter

router = APIRouter()

INDUSTRY_COMMITTEE = "산업통상자원중소벤처기업위원회"

def _role_rank(txt: str) -> int:
    t = (txt or "").strip()
    if t.startswith("위원장"):
        return 0
    if t.startswith("간사"):
        return 1
    return 2  # 위원 등 기타

def _label_election(n: Any) -> str:
    try:
        v = int(n)
    except Exception:
        return "-"
    if v == 1:
        return "초선"
    if v == 2:
        return "재선"
    return f"{v}선"

def _party_summary(rows: List[Dict[str, Any]]) -> Tuple[List[str], List[int]]:
    cnt = Counter((r.get("party") or "").strip() for r in rows if (r.get("party") or "").strip())
    if not cnt:
        return ([], [])
    top2 = cnt.most_common(2)
    labels = [p for p, _ in top2]
    counts = [c for _, c in top2]
    others = sum(v for k, v in cnt.items() if k not in labels)
    if others:
        labels.append("비교섭단체")
        counts.append(others)
    return (labels, counts)

def _district_br(v: str | None) -> str:
    s = (v or "").strip()
    return "<br>".join(s.split()) if s else ""

def _person_key(full_name: str | None, room_no: str | None) -> str:
    base = f"{(full_name or '').strip()}|{(room_no or '').strip()}"
    return hashlib.sha1(base.encode('utf-8')).hexdigest()

@router.get("/congress/industry", response_class=HTMLResponse)
async def congress_industry(request: Request):
    rows: List[Dict[str, Any]] = []
    try:
        rows = (
            sb.table("congress_member_cur")
            .select(
                "role_name,full_name,name_hanja,party,district,phone,room_no,photo_url,member_page_url,"
                "aide_staff,aide_secretary,aide_secretary2,election_count"
            )
            .eq("committee_name", INDUSTRY_COMMITTEE)
            .limit(500)
            .execute()
            .data
        ) or []
    except Exception as e:
        logger.warning(f"industry list fetch failed: {e}")
        rows = []

    # 파생 필드
    for r in rows:
        r["election_label"] = _label_election(r.get("election_count"))
        r["district_br"] = _district_br(r.get("district"))
        try:
            r["person_key"] = _person_key(r.get("full_name"), r.get("room_no"))
        except Exception:
            r["person_key"] = None

    # 정당별 인원수 (이 페이지 데이터 한정)
    party_count = Counter((r.get("party") or "").strip() for r in rows)

    # 정렬: 직위(위원장→간사→위원) → 정당 인원수 내림차순 → 이름 가나다
    def _sort_key(r: Dict[str, Any]):
        role = r.get("role_name") or ""
        party = (r.get("party") or "").strip()
        name = (r.get("full_name") or "").strip()
        return (
            _role_rank(role),
            -party_count.get(party, 0),  # 인원 많은 정당 먼저
            name,  # 가나다 오름차순
        )

    rows.sort(key=_sort_key)

    # 상단 요약(정당별 인원 + 차트)
    labels, counts = _party_summary(rows)
    chart = {"labels": labels, "counts": counts, "total": sum(counts)}
    chart_json = json.dumps(chart, ensure_ascii=False)

    return templates.TemplateResponse(
        "congress/industry.html",
        {
            "request": request,
            "committee_name": INDUSTRY_COMMITTEE,
            "rows": rows,
            "chart": chart,           # 표
            "chart_json": chart_json, # 차트
        },
    )
