from typing import Dict

_SANITIZE_GATE_INSTRUCTION = "외부 AI 호출 전 sanitize 게이트 필수: PII(주민번호/연락처/API키) 마스킹 후 전달."

GATE_INSTRUCTIONS: Dict[int, Dict[str, str]] = {
    0: {
        "g1": "",  # 스킵
        "g2": "셀프 QC: 구문 에러, 기본 기능 확인.",
        "g3": "즉시 머지.",
    },
    1: {
        "g1": "",  # 스킵
        "g2": "셀프 QC: 구문 에러, 기본 기능 확인.",
        "g3": "즉시 머지.",
    },
    2: {
        "g1": "affected_files에 명시된 파일 확인. 다른 팀과 겹침 없는지 확인.",
        "g2": "팀 테스터 또는 마아트 QC 수행. 기능 테스트 필수.",
        "g3": "worktree finish --action pr로 PR 생성 → Gemini 리뷰 대기(5분) → High 0건 시 자동 머지. 타임아웃 시 리뷰 없이 머지.",
    },
    3: {
        "g1": f'3문서 필수. Codex 사전 검증 PASS 필요. affected_files 교차 분석. 3 Step Why 2nd 검증: Codex 사전 리뷰 시 "이 설계의 대안은 무엇이며, 왜 이 접근이 최선인가?" 질문을 포함할 것. {_SANITIZE_GATE_INSTRUCTION}',
        "g2": "Gemini PR 리뷰 + 마아트 독립 검증. 두 검증 모두 PASS 필요.",
        "g3": "G3 독립 검증 필수: python3 scripts/g3_independent_verifier.py --task-id {task_id} 실행 → PASS 필요. worktree finish --action pr → Gemini 리뷰 + 충돌 감지 시 집중 리뷰. 시맨틱 충돌 분석. High 0건 시 자동 머지.",
    },
    4: {
        "g1": f"3문서 필수 + Agent 미팅 만장일치 + Codex 사전 검증 PASS. {_SANITIZE_GATE_INSTRUCTION}",
        "g2": 'Gemini PR 리뷰 + 마아트 QC + 로키 레드팀 투입. 전체 PASS 필요. 3 Step Why 3rd 검증: 로키(DA) 레드팀 리뷰 시 "이 설계가 실패할 수 있는 시나리오는?" 적대적 질문을 포함할 것.',
        "g3": "G3 독립 검증 필수: python3 scripts/g3_independent_verifier.py --task-id {task_id} 실행 → PASS 필요. 전팀 완료 대기 + worktree finish --action pr → Gemini 리뷰 + Graduated Auto-Gate (L1→L2→L3) 통과 필수.",
    },
}


def get_gate_instructions(level: int) -> Dict[str, str]:
    """레벨에 해당하는 게이트 지시를 반환."""
    return GATE_INSTRUCTIONS.get(level, GATE_INSTRUCTIONS[0])


def format_for_prompt(level: int) -> str:
    """프롬프트에 삽입할 게이트 지시 문자열을 생성.

    level >= 3일 때 g1에 sanitize 게이트 지시가 자동 포함됩니다.
    (GATE_INSTRUCTIONS의 g1 값에 이미 포함되어 있으므로 별도 처리 불필요)
    """
    gates = get_gate_instructions(level)
    lines = []
    if gates["g1"]:
        lines.append(f"[G1 설계 게이트] {gates['g1']}")
    if gates["g2"]:
        lines.append(f"[G2 구현 게이트] {gates['g2']}")
    if gates["g3"]:
        lines.append(f"[G3 머지 게이트] {gates['g3']}")
    return "\n".join(lines)


def should_run_codex_check(level: int) -> bool:
    """해당 레벨에서 Codex 사전 검증이 필요한지 반환."""
    return level >= 3


def get_codex_gate_command(
    task_file: str, affected_files: list[str], workspace_root: str = "/home/jay/workspace"
) -> list[str]:
    """codex_gate_check.py 실행 명령 반환."""
    import os

    script_path = os.path.join(workspace_root, "scripts", "codex_gate_check.py")
    cmd = ["python3", script_path, "--task-file", task_file]
    if affected_files:
        cmd.extend(["--affected-files"] + affected_files)
    cmd.extend(["--workspace-root", workspace_root])
    return cmd


def should_run_gemini_cli_gate(level: int) -> bool:
    """G4 Pre-PR Gemini CLI gate를 실행해야 하는지 반환.

    회장 §명시 2026-05-12 Track C (task-2562):
    - Lv.1~2: soft (warning, gate 자체는 실행)
    - Lv.2 risk-trigger: hard (gate 내부 분기)
    - Lv.3+: hard required
    모든 Lv에서 gate를 호출하되, Lv 기반 mixed 정책은 gate 내부에서 결정한다.
    """
    return level >= 1


def get_gemini_cli_gate_command(
    task_id: str,
    workspace_root: str = "/home/jay/workspace",
    affected_files: list[str] | None = None,
    expected_files: list[str] | None = None,
    target_dir: str | None = None,
) -> list[str]:
    """gemini_cli_gate_check.py 실행 명령 반환 (OAuth-personal 강제).

    회장 §명시 1:1:
    - Pre-PR 단발 호출 (long polling 0)
    - GEMINI_API_KEY 거부 (gate 모듈 내부에서 즉시 abort)
    - GitHub Gemini App 호출 0 (PR open 전 단계, 본 gate가 보완)
    """
    import os

    script_path = os.path.join(workspace_root, "scripts", "gemini_cli_gate_check.py")
    cmd = ["python3", script_path, "--task-id", task_id, "--workspace-root", workspace_root]
    if affected_files:
        cmd.extend(["--affected-files", *affected_files])
    if expected_files:
        cmd.extend(["--expected-files", *expected_files])
    if target_dir:
        cmd.extend(["--target-dir", target_dir])
    return cmd
