#!/usr/bin/env python3
"""
team_prompts 모듈 테스트
"""

import os
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent.parent))
from prompts.team_prompts import CHAT_ID, TEAM_INFO, WORKSPACE_ROOT, build_prompt


def test_team_info():
    """팀 정보 데이터 검증"""
    assert "dev1-team" in TEAM_INFO
    assert "dev2-team" in TEAM_INFO
    assert "dev3-team" in TEAM_INFO

    assert TEAM_INFO["dev1-team"]["type"] == "direct"
    assert TEAM_INFO["dev2-team"]["type"] == "direct"
    assert TEAM_INFO["dev3-team"]["type"] == "direct"

    assert "dev4-team" in TEAM_INFO
    assert "dev5-team" in TEAM_INFO
    assert "dev6-team" in TEAM_INFO
    assert "dev7-team" in TEAM_INFO
    assert "dev8-team" in TEAM_INFO

    assert TEAM_INFO["dev4-team"]["type"] == "direct"
    assert TEAM_INFO["dev5-team"]["type"] == "direct"
    assert TEAM_INFO["dev6-team"]["type"] == "direct"
    assert TEAM_INFO["dev7-team"]["type"] == "direct"
    assert TEAM_INFO["dev8-team"]["type"] == "mcp"
    print("[PASS] test_team_info")


def test_chat_id():
    """CHAT_ID 검증 — config 기반"""
    from config.loader import ConfigManager
    expected = os.environ.get("COKACDIR_CHAT_ID") or ConfigManager.get_instance().get_constant("chat_id")
    assert CHAT_ID == expected
    print("[PASS] test_chat_id")


def test_direct_prompt_dev1():
    """dev1-team (direct) 프롬프트 검증"""
    prompt = build_prompt("dev1-team", "task-1.1", "로그인 페이지 개발")

    assert "헤르메스" in prompt
    assert "개발1팀장" in prompt
    assert "task-1.1" in prompt
    # 목차→요약→상세 원칙: task_desc 인라인 대신 파일 경로 참조
    assert "작업 상세는" in prompt
    assert "memory/tasks/task-1.1.md" in prompt
    assert "팀원 구성" in prompt
    assert "불칸" in prompt
    # 경량화: DIRECT-WORKFLOW.md 참조
    assert "DIRECT-WORKFLOW.md" in prompt
    assert "task_id: task-1.1" in prompt
    # 경량화: timer/report는 DIRECT-WORKFLOW.md에 있으므로 프롬프트에 직접 포함 안 됨
    # dev1은 openclaw 위임이 없어야 함
    assert "openclaw" not in prompt
    print("[PASS] test_direct_prompt_dev1")


def test_direct_prompt_dev2():
    """dev2-team (direct) 프롬프트 검증"""
    prompt = build_prompt("dev2-team", "task-2.1", "API 서버 구축")

    assert "오딘" in prompt
    assert "개발2팀장" in prompt
    assert "task-2.1" in prompt
    # 경량화: task_desc는 파일에 저장되므로 프롬프트에 직접 포함 안 됨
    assert "토르" in prompt
    # 경량화: DIRECT-WORKFLOW.md 참조
    assert "DIRECT-WORKFLOW.md" in prompt
    assert "task_id: task-2.1" in prompt
    # dev2는 openclaw 위임이 없어야 함
    assert "openclaw" not in prompt
    print("[PASS] test_direct_prompt_dev2")


def test_mcp_prompt_dev8():
    """dev8-team (mcp) 프롬프트 검증 - MCP tool 기반 팀원 위임"""
    prompt = build_prompt("dev8-team", "task-8.1", "데이터 파이프라인 구축")

    # 기본 정보
    assert "라(Ra)" in prompt
    assert "task-8.1" in prompt

    # MCP tool 기반 팀원 위임 정보
    assert "glm_backend" in prompt
    assert "glm_frontend" in prompt
    assert "glm_uxui" in prompt
    assert "glm_tester" in prompt

    # 최소 변수만 전달
    assert "task_id: task-8.1" in prompt
    assert "team_id: dev8-team" in prompt
    assert "WORKSPACE_ROOT:" in prompt
    assert "CHAT_ID:" in prompt
    assert "ANU_KEY:" in prompt

    # openclaw 참조 없음 (MCP로 대체됨)
    assert "openclaw" not in prompt

    # 작업 상세는 파일 참조
    assert "memory/tasks/task-8.1.md" in prompt

    print("[PASS] test_mcp_prompt_dev8")


def test_direct_prompt_dev4():
    """dev4-team (direct) 프롬프트 검증"""
    prompt = build_prompt("dev4-team", "task-4.1", "힌두팀 코딩 작업")
    assert "비슈누 (Vishnu)" in prompt
    assert "task-4.1" in prompt
    assert "dev4-team" in prompt
    print("[PASS] test_direct_prompt_dev4")


def test_direct_prompt_dev5():
    """dev5-team (direct) 프롬프트 검증"""
    prompt = build_prompt("dev5-team", "task-5.1", "메소포타미아팀 코딩 작업")
    assert "마르둑 (Marduk)" in prompt
    assert "task-5.1" in prompt
    assert "dev5-team" in prompt
    print("[PASS] test_direct_prompt_dev5")


def test_direct_prompt_dev6():
    """dev6-team (direct) 프롬프트 검증"""
    prompt = build_prompt("dev6-team", "task-6.1", "슬라브팀 코딩 작업")
    assert "페룬 (Perun)" in prompt
    assert "task-6.1" in prompt
    assert "dev6-team" in prompt
    print("[PASS] test_direct_prompt_dev6")


def test_direct_prompt_dev7():
    """dev7-team (direct) 프롬프트 검증"""
    prompt = build_prompt("dev7-team", "task-7.1", "마야팀 코딩 작업")
    assert "이참나 (Itzamna)" in prompt
    assert "task-7.1" in prompt
    assert "dev7-team" in prompt
    print("[PASS] test_direct_prompt_dev7")


def test_critical_level():
    """critical 레벨 추가 검증 섹션 - QC-RULES.md 참조"""
    prompt = build_prompt("dev1-team", "task-1.1", "중요 릴리즈 작업", level="critical")

    assert "마아트" in prompt
    assert "독립 검증" in prompt
    assert "QC-RULES.md" in prompt
    assert "검증 레벨: critical" in prompt
    # security 내용은 없어야 함
    assert "로키" not in prompt
    print("[PASS] test_critical_level")


def test_security_level():
    """security 레벨 추가 검증 섹션 - QC-RULES.md 참조"""
    prompt = build_prompt("dev1-team", "task-1.1", "보안 민감 작업", level="security")

    assert "마아트" in prompt
    assert "로키" in prompt
    assert "보안 감사" in prompt
    assert "QC-RULES.md" in prompt
    assert "검증 레벨: security" in prompt
    print("[PASS] test_security_level")


def test_invalid_team():
    """잘못된 팀 ID 에러 처리"""
    try:
        build_prompt("dev99-team", "task-99.1", "없는 팀")
        assert False, "ValueError가 발생해야 합니다"
    except ValueError as e:
        assert "알 수 없는 팀 ID" in str(e)
    print("[PASS] test_invalid_team")


def test_dispatch_compatibility():
    """dispatch.py 호출 방식 호환성 테스트"""
    # dispatch.py에서는 build_prompt(team_id, task_id, task_desc, level) 순서로 호출
    prompt = build_prompt("dev8-team", "task-5.1", "테스트 작업", "normal")
    assert "task-5.1" in prompt
    # 경량화: task_desc는 파일에 저장되고 프롬프트에는 파일 참조만
    assert "memory/tasks/task-5.1.md" in prompt
    assert "DIRECT-WORKFLOW.md" in prompt
    print("[PASS] test_dispatch_compatibility")


def test_orchestrator_compatibility():
    """orchestrator.py 호출 방식 호환성 테스트"""
    # orchestrator.py에서는 build_prompt(team_id, task["id"], task["desc"], task.get("level", "normal"))
    task = {"id": "task-6.1", "desc": "오케스트레이터 테스트", "level": "critical"}
    prompt = build_prompt("dev8-team", task["id"], task["desc"], task.get("level", "normal"))
    assert "task-6.1" in prompt
    # 경량화: task_desc는 파일에 저장, 프롬프트에는 파일 참조
    assert "memory/tasks/task-6.1.md" in prompt
    assert "마아트" in prompt
    print("[PASS] test_orchestrator_compatibility")


def test_prompt_consistency():
    """dispatch.py와 orchestrator.py가 동일한 프롬프트를 생성하는지 확인"""
    # 같은 인자로 호출하면 같은 결과
    prompt1 = build_prompt("dev8-team", "task-7.1", "동일성 테스트", "normal")
    prompt2 = build_prompt("dev8-team", "task-7.1", "동일성 테스트", "normal")
    assert prompt1 == prompt2
    print("[PASS] test_prompt_consistency")


def test_direct_workflow_file_exists():
    """DIRECT-WORKFLOW.md 파일 존재 확인"""
    workflow_path = os.path.join(WORKSPACE_ROOT, "prompts", "DIRECT-WORKFLOW.md")
    assert os.path.exists(workflow_path), f"DIRECT-WORKFLOW.md 파일이 없습니다: {workflow_path}"
    print("[PASS] test_direct_workflow_file_exists")


def test_prompt_size_reduction():
    """dev1/dev2 프롬프트가 1,500자 이하인지 확인 (경량화 검증)"""
    prompt_dev1 = build_prompt("dev1-team", "task-size-1", "크기 테스트 작업")
    prompt_dev2 = build_prompt("dev2-team", "task-size-2", "크기 테스트 작업")
    assert len(prompt_dev1) <= 1500, f"dev1 프롬프트가 1,500자 초과: {len(prompt_dev1)}자"
    assert len(prompt_dev2) <= 1500, f"dev2 프롬프트가 1,500자 초과: {len(prompt_dev2)}자"
    print("[PASS] test_prompt_size_reduction")


def test_placeholder_variables():
    """필수 변수(task_id, team_id, WORKSPACE_ROOT, CHAT_ID, ANU_KEY)가 프롬프트에 포함되는지 확인"""
    prompt_dev1 = build_prompt("dev1-team", "task-ph-1", "플레이스홀더 테스트")
    prompt_dev2 = build_prompt("dev2-team", "task-ph-2", "플레이스홀더 테스트")

    for prompt, task_id, team_id in [
        (prompt_dev1, "task-ph-1", "dev1-team"),
        (prompt_dev2, "task-ph-2", "dev2-team"),
    ]:
        assert f"task_id: {task_id}" in prompt, f"task_id 누락: {task_id}"
        assert f"team_id: {team_id}" in prompt, f"team_id 누락: {team_id}"
        assert "WORKSPACE_ROOT:" in prompt, "WORKSPACE_ROOT 누락"
        assert "CHAT_ID:" in prompt, "CHAT_ID 누락"
        assert "ANU_KEY:" in prompt, "ANU_KEY 누락"

    print("[PASS] test_placeholder_variables")


if __name__ == "__main__":
    test_team_info()
    test_chat_id()
    test_direct_prompt_dev1()
    test_direct_prompt_dev2()
    test_mcp_prompt_dev8()
    test_direct_prompt_dev4()
    test_direct_prompt_dev5()
    test_direct_prompt_dev6()
    test_direct_prompt_dev7()
    test_critical_level()
    test_security_level()
    test_invalid_team()
    test_dispatch_compatibility()
    test_orchestrator_compatibility()
    test_prompt_consistency()
    test_direct_workflow_file_exists()
    test_prompt_size_reduction()
    test_placeholder_variables()
    print("\n=== 모든 테스트 통과! ===")
