"""organization-structure.json에서 팀/봇 매핑을 동적으로 로드하는 유틸리티.

팀 추가/삭제 시 코드 수정 없이 이 파일을 통해 모든 매핑이 자동 갱신됩니다.
"""

from __future__ import annotations

import json
import os
import re
from pathlib import Path
from typing import Optional

_CACHE: dict[str, dict] = {}


def _get_workspace_root(workspace_root: str | None = None) -> str:
    return workspace_root or os.environ.get("WORKSPACE_ROOT", "/home/jay/workspace")


def _load_org(workspace_root: str | None = None) -> dict:
    """organization-structure.json 로드 (캐시 포함). 실패 시 빈 dict 반환."""
    root = _get_workspace_root(workspace_root)
    if root in _CACHE:
        return _CACHE[root]
    path = Path(root) / "memory" / "organization-structure.json"
    try:
        data = json.loads(path.read_text(encoding="utf-8"))
        _CACHE[root] = data
        return data
    except Exception:
        _CACHE[root] = {}
        return {}


def invalidate_cache() -> None:
    """캐시를 초기화한다."""
    _CACHE.clear()


def _get_dev_office(data: dict) -> dict:
    teams = data.get("structure", {}).get("columns", {}).get("teams", [])
    for team in teams:
        if team.get("team_id") == "development-office":
            return team
    return {}


def _bot_letter(index: int) -> str:
    """0-based index → bot letter (0→'b', 1→'c', ...)"""
    return chr(ord("b") + index)


def get_dev_teams(workspace_root: str | None = None) -> list[dict]:
    """development-office의 sub_teams 목록 반환. 실패 시 빈 리스트."""
    data = _load_org(workspace_root)
    return _get_dev_office(data).get("sub_teams", [])


def get_dev_team_ids(workspace_root: str | None = None) -> list[str]:
    """["dev1-team", "dev2-team", ...]"""
    return [t["sub_team_id"] for t in get_dev_teams(workspace_root)]


def get_dev_short_ids(workspace_root: str | None = None) -> list[str]:
    """["dev1", "dev2", ...]"""
    return [tid.replace("-team", "") for tid in get_dev_team_ids(workspace_root)]


def build_team_bot_map(workspace_root: str | None = None) -> dict[str, str]:
    """{"dev1-team": "dev1", "dev2-team": "dev2", ...}"""
    return {tid: tid.replace("-team", "") for tid in get_dev_team_ids(workspace_root)}


def build_bot_to_key_map(workspace_root: str | None = None) -> dict[str, str]:
    """{"bot-b": "dev1", "bot-c": "dev2", ...}  (dev1→bot-b, dev2→bot-c, ...)"""
    result: dict[str, str] = {}
    for i, team in enumerate(get_dev_teams(workspace_root)):
        short = team["sub_team_id"].replace("-team", "")
        result[f"bot-{_bot_letter(i)}"] = short
    return result


def build_team_to_bot_id_map(workspace_root: str | None = None) -> dict[str, str]:
    """{"dev1-team": "bot-b", "dev2-team": "bot-c", ...}"""
    result: dict[str, str] = {}
    for i, team in enumerate(get_dev_teams(workspace_root)):
        result[team["sub_team_id"]] = f"bot-{_bot_letter(i)}"
    return result


def build_bot_labels(workspace_root: str | None = None) -> dict[str, str]:
    """{"dev1": "봇B (개발1팀)", "dev2": "봇C (개발2팀)", ...}"""
    result: dict[str, str] = {}
    for i, team in enumerate(get_dev_teams(workspace_root)):
        short = team["sub_team_id"].replace("-team", "")
        name = team.get("sub_team_name", short)
        result[short] = f"봇{_bot_letter(i).upper()} ({name})"
    return result


def build_short_labels(workspace_root: str | None = None) -> dict[str, str]:
    """{"dev1-team": "1팀", "dev2-team": "2팀", ...}  (개발N팀 → N팀)"""
    result: dict[str, str] = {}
    for team in get_dev_teams(workspace_root):
        tid = team["sub_team_id"]
        name = team.get("sub_team_name", "")
        result[tid] = re.sub(r"^개발", "", name) if name else tid.replace("-team", "")
    return result


def build_full_labels(workspace_root: str | None = None) -> dict[str, str]:
    """{"dev1-team": "개발1팀", "dev2-team": "개발2팀", ...}"""
    return {
        team["sub_team_id"]: team.get("sub_team_name", team["sub_team_id"]) for team in get_dev_teams(workspace_root)
    }


def build_bot_team_map(workspace_root: str | None = None) -> dict[str, Optional[str]]:
    """{"dev1": "dev1", ..., "anu": None}"""
    result: dict[str, Optional[str]] = {s: s for s in get_dev_short_ids(workspace_root)}
    result["anu"] = None
    return result


def get_all_team_ids(workspace_root: str | None = None) -> list[str]:
    """모든 팀 ID (dev + marketing, consulting, ...) 반환."""
    data = _load_org(workspace_root)
    teams = data.get("structure", {}).get("columns", {}).get("teams", [])
    result: list[str] = []
    for team in teams:
        tid = team.get("team_id")
        if tid == "development-office":
            result.extend(sub["sub_team_id"] for sub in team.get("sub_teams", []))
        elif tid:
            result.append(tid)
    return result
