"""
test_token_optimization_green.py

토큰 최적화 GREEN 4건 (G-1~G-4) 검증 테스트 (task-1269.1)

G-1: 선택적 노하우 로딩 — phase_group 파라미터
G-2: Overview QC 이중 적재 해결
G-3: 에스컬레이션 섹션 중복 제거
G-4: 서브에이전트 결과 구조화
"""

import os
import sys
from pathlib import Path

import pytest

workspace = Path(os.environ.get("WORKSPACE_ROOT", "/home/jay/workspace"))
if str(workspace) not in sys.path:
    sys.path.insert(0, str(workspace))

from prompts.image_workflow import (
    build_phase_minus1_prompt,
    build_workflow_overview_prompt,
)
from prompts.team_prompts import (
    _assemble_composite_prompt,
    _build_design_prompt,
    _build_marketing_prompt,
)


class TestG1SelectiveKnowhowLoading:
    """G-1: build_phase_minus1_prompt phase_group 파라미터 검증"""

    def test_default_phase_group_loads_all_three(self):
        """기본값(final)은 3개 파일 모두 포함"""
        result = build_phase_minus1_prompt("test-g1")
        assert "knowhow-marketing.md" in result
        assert "knowhow-design.md" in result
        assert "design-qc-knowhow.md" in result
        assert "3개 모두" in result

    def test_copy_phase_group(self):
        """copy 그룹은 marketing + qc 2개만"""
        result = build_phase_minus1_prompt("test-g1", phase_group="copy")
        assert "knowhow-marketing.md" in result
        assert "design-qc-knowhow.md" in result
        assert "knowhow-design.md" not in result
        assert "2개 모두" in result

    def test_design_phase_group(self):
        """design 그룹은 design + qc 2개만"""
        result = build_phase_minus1_prompt("test-g1", phase_group="design")
        assert "knowhow-design.md" in result
        assert "design-qc-knowhow.md" in result
        assert "knowhow-marketing.md" not in result
        assert "2개 모두" in result

    def test_final_phase_group_explicit(self):
        """명시적 final도 3개 포함"""
        result = build_phase_minus1_prompt("test-g1", phase_group="final")
        assert "knowhow-marketing.md" in result
        assert "knowhow-design.md" in result
        assert "design-qc-knowhow.md" in result

    def test_invalid_phase_group_raises(self):
        """잘못된 phase_group은 ValueError"""
        with pytest.raises(ValueError, match="유효하지 않은 phase_group"):
            build_phase_minus1_prompt("test-g1", phase_group="invalid")

    def test_backward_compatibility(self):
        """phase_group 미지정 시 기존 동작과 동일 (3개 파일 포함)"""
        result = build_phase_minus1_prompt("test-g1")
        assert "design-qc-knowhow.md" in result
        assert "knowhow-marketing.md" in result
        assert "knowhow-design.md" in result


class TestG2OverviewQCRemoval:
    """G-2: build_workflow_overview_prompt에서 QC 상세 제거"""

    def test_no_category_a_details(self):
        """카테고리 A 상세가 overview에 없음"""
        result = build_workflow_overview_prompt("test-g2")
        assert "A-01" not in result
        assert "글자 겹침" not in result

    def test_no_category_b_details(self):
        """카테고리 B 상세가 overview에 없음"""
        result = build_workflow_overview_prompt("test-g2")
        assert "B-01" not in result
        assert "CTA 명확성" not in result

    def test_no_fail_categories_details(self):
        """FAIL 카테고리 상세가 overview에 없음"""
        result = build_workflow_overview_prompt("test-g2")
        assert "TEXT_OVERLAP" not in result
        assert "FAIL 사유 카테고리" not in result

    def test_no_escalation_details(self):
        """에스컬레이션 상세가 overview에 없음"""
        result = build_workflow_overview_prompt("test-g2")
        assert "카피 QC 루프 상한" not in result

    def test_qc_loading_note_present(self):
        """QC 기준은 Phase에서 로딩된다는 안내 포함"""
        result = build_workflow_overview_prompt("test-g2")
        assert "QC 기준" in result
        assert "각 Phase에서 로딩" in result

    def test_phase_list_preserved(self):
        """Phase 목록은 유지"""
        result = build_workflow_overview_prompt("test-g2")
        assert "Phase -1" in result
        assert "Phase 0" in result
        assert "Phase 1" in result
        assert "Phase 3" in result
        assert "Phase 5" in result

    def test_start_condition_preserved(self):
        """시작 조건은 유지"""
        result = build_workflow_overview_prompt("test-g2")
        assert "제이회장님 승인 필수" in result


class TestG3EscalationDedup:
    """G-3: 에스컬레이션 섹션 중복 제거"""

    def test_escalation_rules_file_exists(self):
        """외부 파일이 존재"""
        path = workspace / "memory" / "specs" / "escalation-rules.md"
        assert path.exists(), f"escalation-rules.md not found at {path}"

    def test_escalation_rules_file_content(self):
        """외부 파일에 핵심 규칙 포함"""
        path = workspace / "memory" / "specs" / "escalation-rules.md"
        content = path.read_text(encoding="utf-8")
        assert "카피 QC 루프 상한" in content
        assert "디자인 QC 루프 상한" in content
        assert "동일 FAIL 카테고리" in content
        assert "에스컬레이션" in content

    def test_phase0_uses_reference(self):
        """Phase 0 프롬프트가 참조 문구 사용"""
        from prompts.image_workflow import build_phase0_prompt

        result = build_phase0_prompt("test-g3")
        assert "escalation-rules.md 참조" in result
        assert "카피 QC 루프 상한: 5회" not in result  # 인라인 상세 없음

    def test_phase1_uses_reference(self):
        """Phase 1 프롬프트가 참조 문구 사용"""
        from prompts.image_workflow import build_phase1_prompt

        result = build_phase1_prompt("test-g3", "/tmp/brief.md")
        assert "escalation-rules.md 참조" in result

    def test_phase2_uses_reference(self):
        """Phase 2 프롬프트가 참조 문구 사용"""
        from prompts.image_workflow import build_phase2_prompt

        result = build_phase2_prompt("test-g3", "/tmp/copy.md")
        assert "escalation-rules.md 참조" in result

    def test_phase3_uses_reference(self):
        """Phase 3 프롬프트가 참조 문구 사용"""
        from prompts.image_workflow import build_phase3_prompt

        result = build_phase3_prompt("test-g3", "/tmp/plan.md")
        assert "escalation-rules.md 참조" in result

    def test_phase4_uses_reference(self):
        """Phase 4 프롬프트가 참조 문구 사용"""
        from prompts.image_workflow import build_phase4_prompt

        result = build_phase4_prompt("test-g3", ["/tmp/img.png"])
        assert "escalation-rules.md 참조" in result

    def test_phase3_5_uses_reference(self):
        """Phase 3.5 프롬프트가 참조 문구 사용"""
        from prompts.image_workflow import build_phase3_5_prompt

        result = build_phase3_5_prompt("test-g3", ["/tmp/img.png"])
        assert "escalation-rules.md 참조" in result


class TestG4SubagentResultRules:
    """G-4: 복합팀/디자인팀/마케팅팀에 서브에이전트 결과 규칙 포함"""

    def test_marketing_prompt_contains_subagent_rules(self):
        """마케팅팀 프롬프트에 서브에이전트 결과 규칙 포함"""
        from prompts.team_prompts import build_prompt

        result = build_prompt(
            team_id="marketing",
            task_id="test-g4",
            task_desc="test task",
            level="normal",
        )
        assert "서브에이전트(Task tool) 결과 규칙" in result
        assert "500자 이내" in result
        assert "FAIL 코드와 사유를 요약에 포함" in result

    def test_design_prompt_contains_subagent_rules(self):
        """디자인팀 프롬프트에 서브에이전트 결과 규칙 포함"""
        from prompts.team_prompts import build_prompt

        result = build_prompt(
            team_id="design",
            task_id="test-g4",
            task_desc="test task",
            level="normal",
        )
        assert "서브에이전트(Task tool) 결과 규칙" in result
        assert "500자 이내" in result

    def test_composite_prompt_contains_subagent_rules(self):
        """복합팀 프롬프트에 서브에이전트 결과 규칙 포함"""
        from prompts.team_prompts import build_composite_prompt

        result = build_composite_prompt(
            composite_teams=["marketing", "design"],
            task_id="test-g4",
            task_desc="test composite task",
            level="normal",
        )
        assert "서브에이전트(Task tool) 결과 규칙" in result
        assert "500자 이내" in result
        assert "FAIL 코드와 사유를 요약에 포함" in result
