from __future__ import annotations

import re
from typing import Any, Optional, Dict, List
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse

from app.web.deps import (
    templates, sb,
    COMPANY_ORDER, POS_ORDER, TODAY,
    _parse_date_parts, _parts_to_date, _date_display_and_compare,
    _norm_company_label, _normalize_multiline,
)

router = APIRouter()

# --- 성별 ---
def _gender_label(g: Any) -> str:
    s = str(g or "").strip().lower()
    if not s: return "-"
    if s in {"f","female","여","여성","여자","女"}: return "여"
    if s in {"m","male","남","남성","남자","男"}: return "남"
    return str(g)

def _is_female(g: Any) -> bool:
    return _gender_label(g) == "여"

# --- 한전 경력 표시 ---
_KEPCO_WORD_RE = re.compile(r"(?<![가-힣A-Za-z0-9])한전(?![가-힣A-Za-z0-9])")
def _is_kepco_alum_text(career: Any) -> bool:
    if not career: return False
    t = str(career)
    if "한국전력공사" in t: return True
    if _KEPCO_WORD_RE.search(t): return True
    return False

# --- 직위 정규화(사장/감사 → 열에 매핑) ---
def _normalize_position(pos: str | None) -> Optional[str]:
    if not pos: return None
    p = (pos or "").strip()
    p0 = p.replace(" ", "")
    if "비상임" in p:                  # 비상임 이사 전반
        return "비상임이사"
    if "상임감사" in p0:               # 상임감사
        return "상임감사"
    if ("감사위원" in p or p.endswith("감사")) and "비상임" not in p:
        return "상임감사"
    if "상임이사" in p:
        return "상임이사"
    if "사장" in p and "대행" not in p:
        return "상임기관장"
    if p0 in {"기관장","상임기관장"}:
        return "상임기관장"
    if p in POS_ORDER:
        return p
    return None

@router.get("/group/executive", response_class=HTMLResponse)
async def group_executive(request: Request):
    try:
        # 핵심: 운영 뷰로 전환
        res = sb.table("kepco_org_cur").select("*").limit(10000).execute()
        raw: List[Dict] = res.data or []
    except Exception:
        raw = []

    grid: dict[str, dict[str, list[dict]]] = {c:{p:[] for p in POS_ORDER} for c in COMPANY_ORDER}
    female_counts = {c:0 for c in COMPANY_ORDER}
    total_counts  = {c:0 for c in COMPANY_ORDER}

    for r in raw:
        dep_raw = (r.get("department") or "").strip()
        company = _norm_company_label(dep_raw)
        if company not in grid:
            continue

        total_counts[company] += 1
        if _is_female(r.get("gender")):
            female_counts[company] += 1

        pos_norm = _normalize_position(r.get("position"))
        if pos_norm is None:
            continue

        _, end_cmp = _date_display_and_compare(r.get("end"))
        expired = bool(end_cmp and end_cmp < TODAY)

        start_disp, _ = _date_display_and_compare(r.get("start"))
        end_disp, _   = _date_display_and_compare(r.get("end"))

        person = dict(r)
        person["_expired"] = expired
        person["_is_kepco_alum"] = _is_kepco_alum_text(r.get("career"))
        person["_start_disp"] = start_disp
        person["_end_disp"] = end_disp

        gender = _gender_label(r.get("gender"))
        name = (r.get("name") or "-").strip()
        person["_name_line"] = f"{name}({gender})" if gender != "-" else name

        grid[company][pos_norm].append(person)

    gender_stats = [{"female": female_counts[c], "total": total_counts[c]} for c in COMPANY_ORDER]
    columns = COMPANY_ORDER
    rows_for_tpl = [{"position": p, "cells": [grid[c][p] for c in columns]} for p in POS_ORDER]

    return templates.TemplateResponse("group/executive.html", {
        "request": request, "columns": columns, "rows": rows_for_tpl, "gender_stats": gender_stats,
    })
