"""
test_1921b_team_scope.py — task-1921_b 검증 테스트
V-4: g3 팀 범위 검증 + V-6: scope_check SKIP→WARN
"""

import sys

import pytest

# 모듈 경로
sys.path.insert(0, "/home/jay/workspace/scripts")
sys.path.insert(0, "/home/jay/workspace/teams/shared/verifiers")

import g3_independent_verifier as g3v
import scope_check as sc


# ============================================================
# V-4 테스트: check_team_scope
# ============================================================

class TestCheckTeamScope:
    """g3_independent_verifier.check_team_scope() 유닛 테스트"""

    def test_pass_own_team_files(self):
        """자기 팀 파일만 있으면 PASS"""
        entries = [
            {"file_path": "teams/dev4/qc/qc_verify.py"},
            {"file_path": "teams/dev4/CLAUDE.md"},
        ]
        status, warnings = g3v.check_team_scope(entries, "dev4-team")
        assert status == "PASS"
        assert warnings == []

    def test_pass_shared_files(self):
        """공용 파일(teams/shared, scripts, utils 등)만 있으면 PASS"""
        entries = [
            {"file_path": "teams/shared/verifiers/scope_check.py"},
            {"file_path": "scripts/g3_independent_verifier.py"},
            {"file_path": "utils/helper.py"},
            {"file_path": "memory/reports/test.md"},
            {"file_path": "tests/test_example.py"},
        ]
        status, warnings = g3v.check_team_scope(entries, "dev4-team")
        assert status == "PASS"
        assert warnings == []

    def test_warn_other_team_files(self):
        """다른 팀 파일이 있으면 WARN"""
        entries = [
            {"file_path": "teams/dev1/CLAUDE.md"},  # dev1 파일 → dev4에서 접근 불가
            {"file_path": "scripts/g3_independent_verifier.py"},  # 공용 → OK
        ]
        status, warnings = g3v.check_team_scope(entries, "dev4-team")
        assert status == "WARN"
        assert len(warnings) == 1
        assert "dev1" in warnings[0]

    def test_pass_mixed_own_and_shared(self):
        """자기 팀 + 공용 파일 혼합 → PASS"""
        entries = [
            {"file_path": "teams/dev2/qc/qc_verify.py"},
            {"file_path": "teams/shared/verifiers/scope_check.py"},
            {"file_path": "scripts/g3_independent_verifier.py"},
        ]
        status, warnings = g3v.check_team_scope(entries, "dev2-team")
        assert status == "PASS"
        assert warnings == []

    def test_warn_with_line_number_suffix(self):
        """파일경로:라인번호 형식도 올바르게 처리"""
        entries = [
            {"file_path": "teams/dev1/qc/qc_verify.py:42"},
        ]
        status, warnings = g3v.check_team_scope(entries, "dev3-team")
        assert status == "WARN"
        assert len(warnings) == 1


# ============================================================
# V-6 테스트: scope_check audit-trail 부재 시 WARN
# ============================================================

class TestScopeCheckAuditTrailAbsence:
    """scope_check.verify()에서 audit-trail 부재 시 WARN 반환 확인"""

    def test_warn_when_audit_trail_not_found(self, tmp_path):
        """audit-trail.jsonl이 없으면 WARN (SKIP 아님)"""
        nonexistent = str(tmp_path / "nonexistent" / "audit-trail.jsonl")
        result = sc.verify(
            expected_files=["src/main.py"],
            task_id="test-task",
            audit_trail_path=nonexistent,
        )
        assert result["status"] == "WARN", f"Expected WARN, got {result['status']}"
        assert any("부재" in d or "범위 검증 불가" in d for d in result["details"])

    def test_warn_message_contains_path(self, tmp_path):
        """WARN 메시지에 audit-trail 경로가 포함"""
        nonexistent = str(tmp_path / "no-file.jsonl")
        result = sc.verify(
            expected_files=["src/main.py"],
            task_id="test-task",
            audit_trail_path=nonexistent,
        )
        assert result["status"] == "WARN"
        details_text = " ".join(result["details"])
        assert "no-file.jsonl" in details_text

    def test_skip_when_no_expected_files(self):
        """expected_files가 비어있으면 여전히 SKIP"""
        result = sc.verify(
            expected_files=[],
            task_id="test-task",
            audit_trail_path="/nonexistent/path",
        )
        assert result["status"] == "SKIP"


# ============================================================
# V-4 통합 테스트: g3 main()에 --team-id 전달
# ============================================================

class TestG3TeamScopeIntegration:
    """g3_independent_verifier main()에서 --team-id 동작 통합 테스트"""

    def _run_main(self, monkeypatch, tmp_path, task_id, team_id=None):
        monkeypatch.setattr(g3v, "WORKSPACE_ROOT", str(tmp_path))
        argv = ["g3_independent_verifier.py", "--task-id", task_id]
        if team_id:
            argv.extend(["--team-id", team_id])
        monkeypatch.setattr(sys, "argv", argv)
        with pytest.raises(SystemExit) as exc_info:
            g3v.main()
        return exc_info.value.code

    def _make_report(self, tmp_path, task_id, content):
        reports_dir = tmp_path / "memory" / "reports"
        reports_dir.mkdir(parents=True, exist_ok=True)
        (reports_dir / f"{task_id}.md").write_text(content, encoding="utf-8")

    def _make_file(self, tmp_path, rel_path, content="# placeholder"):
        target = tmp_path / rel_path
        target.parent.mkdir(parents=True, exist_ok=True)
        target.write_text(content, encoding="utf-8")

    def test_pass_own_team_verified_files(self, tmp_path, monkeypatch):
        """--team-id dev4-team + dev4 파일만 verified → PASS (exit 0)"""
        task_id = "task-v4-001"
        report = """\
# task-v4-001 보고서

## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| teams/dev4/qc/qc_verify.py | 수정 | grep "VERIFY_OK" OK | verified |
| scripts/g3_independent_verifier.py | 수정 | grep "team_scope" OK | verified |
"""
        self._make_report(tmp_path, task_id, report)
        self._make_file(tmp_path, "teams/dev4/qc/qc_verify.py", "VERIFY_OK = True\n")
        self._make_file(tmp_path, "scripts/g3_independent_verifier.py", "team_scope = True\n")

        exit_code = self._run_main(monkeypatch, tmp_path, task_id, "dev4-team")
        assert exit_code == 0  # WARN은 있을 수 있지만 FAIL이 아니므로 exit 0

    def test_warn_other_team_files_still_passes(self, tmp_path, monkeypatch):
        """--team-id dev4-team + dev1 파일 verified → WARN이지만 exit 0 (FAIL 아님)"""
        task_id = "task-v4-002"
        report = """\
# task-v4-002 보고서

## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| teams/dev1/CLAUDE.md | 수정 | grep "MODIFIED" OK | verified |
"""
        self._make_report(tmp_path, task_id, report)
        self._make_file(tmp_path, "teams/dev1/CLAUDE.md", "MODIFIED = True\n")

        exit_code = self._run_main(monkeypatch, tmp_path, task_id, "dev4-team")
        assert exit_code == 0  # WARN ≠ FAIL

    def test_no_team_id_skips_scope_check(self, tmp_path, monkeypatch):
        """--team-id 없으면 team_scope 검증 SKIP"""
        task_id = "task-v4-003"
        report = """\
# task-v4-003 보고서

## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| scripts/g3_independent_verifier.py | 수정 | grep "OK_KEY" OK | verified |
"""
        self._make_report(tmp_path, task_id, report)
        self._make_file(tmp_path, "scripts/g3_independent_verifier.py", "OK_KEY = True\n")

        exit_code = self._run_main(monkeypatch, tmp_path, task_id)  # no team_id
        assert exit_code == 0
