"""복합업무 임시팀 공유 상수 (Single Source of Truth)

dispatch.py와 team_prompts.py에서 공통으로 사용하는 composite 관련 상수.

## 카테고리 분류 (task-2530, 2026-05-10 회장 §결정)

- ① 단일: --team 단일 팀 (composite 아님, 본 모듈 무관)
- ② 논리적: --composite logical1,logical2 (예: marketing,design) — 기존 동작
- ③ 카테고리:
  - ③_mixed: logical + cross-cutting agent 혼합 (예: marketing,loki)
  - ③_cross_cutting_only: 횡단조직 agent 단독 조합 (예: maat,loki)
"""

from typing import Dict, List

# ── ② 카테고리: 논리적 팀 ────────────────────────────────────────────
COMPOSITE_ALLOWED_TEAMS: frozenset = frozenset({"marketing", "design", "consulting", "publishing"})
MAX_COMPOSITE_TEAMS: int = 3

# ── ③ 카테고리: 횡단조직 agent (task-2530, 회장 §결정 2026-05-10) ────
# organization-structure.json `rows` 횡단조직 lead + security-team lead(loki)
# - loki: 보안팀장 (Primary) — security-team.json
# - maat: QC 매니저 — qc-center
# - janus: DevOps — devops-center
# - venus: Gemini센터장 — gemini-center
# - atlas: Codex센터장 — codex-center
# - prometheus: 제품전략 리드 — product-strategy-center
# - chronos: 회고분석 리드 — retrospective-center
COMPOSITE_CROSS_CUTTING_AGENTS: frozenset = frozenset(
    {"loki", "maat", "janus", "venus", "atlas", "prometheus", "chronos"}
)

# ── 통합 검증 set (③ 카테고리 허용) ──────────────────────────────────
COMPOSITE_ALL_ALLOWED: frozenset = COMPOSITE_ALLOWED_TEAMS | COMPOSITE_CROSS_CUTTING_AGENTS

# ── ③ 카테고리 trigger 키워드 (bot_status 자동 추천 게이트) ────────
# task spec/desc에 이 키워드가 있을 때만 composite 후보로 진입.
# 키워드 비매칭 시에는 keyword 기반 단일팀 추천만 동작 (기존 동작 유지).
COMPOSITE_TRIGGER_KEYWORDS: frozenset = frozenset(
    {"검증", "감사", "QC", "redteam", "보안검토", "복합검증"}
)

# ── 페르소나 라벨 (③ 합성 prompt에서 사용) ───────────────────────────
CROSS_CUTTING_AGENT_LABELS: Dict[str, str] = {
    "loki": "로키(보안 redteam)",
    "maat": "마아트(QC 매니저)",
    "janus": "야누스(DevOps)",
    "venus": "비너스(Gemini 센터장)",
    "atlas": "아틀라스(Codex 센터장)",
    "prometheus": "프로메테우스(제품전략 리드)",
    "chronos": "크로노스(회고분석 리드)",
}

# ── HANDOFF 필드 ─────────────────────────────────────────────────────
HANDOFF_REQUIRED_FIELDS: Dict[frozenset, List[str]] = {
    # ② 카테고리 (기존 — 변경 금지)
    frozenset({"marketing", "design"}): [
        "플랫폼",
        "사이즈/형식",
        "톤앤매너",
        "CTA 문구",
        "타겟 오디언스",
    ],
    frozenset({"consulting", "publishing"}): [
        "대상 독자",
        "법적 검토 여부",
        "인용 출처",
        "데이터 정확성",
    ],
    frozenset({"marketing", "publishing"}): [
        "톤앤매너",
        "타겟 오디언스",
        "키워드",
        "SEO 메타",
    ],
    frozenset({"marketing", "consulting"}): [
        "타겟 고객",
        "상품 정보",
        "규제 사항",
        "CTA 문구",
    ],
    # ③ 카테고리 (task-2530 신규) — logical × cross-cutting
    frozenset({"marketing", "loki"}): [
        "redteam 공격 시나리오",
        "보안 위협 평가",
        "마케팅 카피 검증 결과",
        "취약점 우선순위",
    ],
    frozenset({"design", "maat"}): [
        "QC 체크리스트",
        "디자인 일관성 평가",
        "사용성 검증 결과",
        "통과/FAIL 판정",
    ],
    frozenset({"consulting", "loki"}): [
        "보안 검토 결과",
        "법적 위험 평가",
        "권고 우선순위",
        "추가 감사 요건",
    ],
    frozenset({"publishing", "maat"}): [
        "QC 검증 항목",
        "출판물 정확도 평가",
        "법적 검토 통과 여부",
        "최종 발행 승인",
    ],
}

DEFAULT_HANDOFF_FIELDS: List[str] = ["핵심 결정사항", "산출물 파일 경로", "다음 Phase 요구사항"]
