"""Phase 1 통합 테스트."""

import json
import os
import sys
from pathlib import Path

sys.path.insert(0, "/home/jay/workspace")
sys.path.insert(0, "/home/jay/workspace/hooks")


# INT-01: Phase 1 플래그 활성화 상태 확인
def test_int01_phase1_flags_activated():
    """Phase 1 플래그 3개 활성화, Phase 2 플래그(trust5_tagging, model_map) 활성화 확인."""
    from utils.feature_flags import FeatureFlagLoader

    loader = FeatureFlagLoader()
    flags = loader.get_all_flags()
    # Phase 1 flags: true
    assert flags.get("progressive_disclosure_enabled") is True
    assert flags.get("rw_isolation_enabled") is True
    assert flags.get("hooks_enforcement_enabled") is True
    # Phase 2 flags: true (활성화됨)
    assert flags.get("trust5_tagging_enabled") is True
    assert flags.get("model_map_enabled") is True
    assert flags.get("haiku_ab_enabled") is False


# INT-02: progressive_disclosure_enabled=true 후 summary phase 실행
def test_int02_pd_enabled_summary(tmp_path):
    """PD 플래그 활성 시 summary 토큰 검증."""
    from unittest.mock import patch

    from prompts.team_prompts import _count_tokens, build_prompt

    flags_file = tmp_path / "feature_flags.json"
    data = {
        "schema_version": "1.0",
        "flags": {"progressive_disclosure_enabled": True},
    }
    flags_file.write_text(json.dumps(data), encoding="utf-8")
    flags_path = str(flags_file)

    with patch(
        "utils.feature_flags.FeatureFlagLoader.__init__",
        lambda self, **_kw: (
            setattr(self, "_path", flags_path),
            setattr(self, "_cache", {}),
            setattr(self, "_mtime", 0.0),
            self._load(),
        )[-1],
    ):
        build_prompt("dev1-team", "task-int-02a", "통합테스트 작업 " * 50, disclosure_phase="full")
        summary_prompt = build_prompt("dev1-team", "task-int-02b", "통합테스트 작업 " * 50, disclosure_phase="summary")
    summary_tokens = _count_tokens(summary_prompt)
    # summary는 600 이하
    assert summary_tokens <= 600, f"summary tokens {summary_tokens} > 600"


# INT-03: rw_isolation_enabled=true 후 read 에이전트 - worktree 미생성
def test_int03_rw_read_no_worktree():
    """read_only=True 시 worktree 미생성."""
    from scripts.worktree_manager import cmd_create

    result = cmd_create("/tmp/test-project", "task-int-03", "dev1", read_only=True)
    assert result["worktree_path"] is None
    assert result["status"] == "skipped"


# INT-04: rw_isolation_enabled=true 후 write 에이전트 - read_only 기본값 False
def test_int04_rw_write_default():
    """write(기본값) 시 read_only=False."""
    import inspect

    from scripts.worktree_manager import cmd_create

    sig = inspect.signature(cmd_create)
    assert sig.parameters["read_only"].default is False


# INT-05: hooks_enforcement_enabled=true 후 circuit breaker 동작
def test_int05_hooks_circuit_breaker(tmp_path):
    """circuit breaker가 halt 후 차단."""
    from hooks.circuit_breaker import cmd_check, cmd_record

    state_path = str(tmp_path / "cb.json")
    # 3-tuple 연속 3회
    for _ in range(3):
        cmd_record("standard", "test.py", "ruff_error", tool="Write", state_path=state_path)
    assert cmd_check("test.py", state_path=state_path) == "halt"


# INT-06: circuit breaker reset 후 정상 진행
def test_int06_circuit_breaker_reset(tmp_path):
    """halt 후 reset하면 다시 ok."""
    from hooks.circuit_breaker import cmd_check, cmd_record, cmd_reset

    state_path = str(tmp_path / "cb.json")
    for _ in range(3):
        cmd_record("standard", "test.py", "ruff_error", tool="Write", state_path=state_path)
    assert cmd_check("test.py", state_path=state_path) == "halt"
    cmd_reset(state_path=state_path)
    assert cmd_check("test.py", state_path=state_path) == "ok"


# INT-07: feature_flags + CRITICAL_SET + circuit_breaker 전체 연동
def test_int07_full_integration():
    """전체 시스템 구성요소 존재 확인."""
    # feature_flags.json 존재
    assert Path("/home/jay/workspace/.claude/feature_flags.json").exists()
    # settings.json 존재
    assert Path("/home/jay/workspace/.claude/settings.json").exists()
    # circuit_breaker.py 존재
    assert Path("/home/jay/workspace/hooks/circuit_breaker.py").exists()
    # post_tool_use.sh 존재 + 실행권한
    sh_path = "/home/jay/workspace/hooks/post_tool_use.sh"
    assert Path(sh_path).exists()
    assert os.access(sh_path, os.X_OK)
    # baseline 존재
    assert Path("/home/jay/workspace/.metrics/baseline/baseline_2026-04-03.json").exists()
    # spec docs 존재
    specs_dir = Path("/home/jay/workspace/docs/specs")
    assert specs_dir.exists()
    assert len(list(specs_dir.glob("*.md"))) >= 6
