"""P2-4: TRUST 5 태그 단위 테스트."""

import json
import os
import sys

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "teams", "dev1", "qc"))

import pytest


def test_trust_map_contains_all_dimensions():
    """TRUST_MAP이 5차원 모두 포함하는지 확인."""
    from teams.dev1.qc.qc_verify import TRUST_MAP

    expected = {"Tested", "Readable", "Unified", "Secured", "Trackable"}
    assert set(TRUST_MAP.keys()) == expected


def test_trust_map_verifier_mapping():
    """각 verifier가 올바른 차원에 매핑되는지 확인."""
    from teams.dev1.qc.qc_verify import TRUST_MAP

    assert "test_runner" in TRUST_MAP["Tested"]
    assert "tdd_check" in TRUST_MAP["Tested"]
    assert "style_check" in TRUST_MAP["Readable"]
    assert "pyright_check" in TRUST_MAP["Readable"]
    assert "scope_check" in TRUST_MAP["Unified"]
    assert "schema_contract" in TRUST_MAP["Secured"]
    assert "data_integrity" in TRUST_MAP["Trackable"]
    assert "file_check" in TRUST_MAP["Trackable"]


def test_api_health_in_independent():
    """api_health가 _independent에만 포함되는지 확인."""
    from teams.dev1.qc.qc_verify import TRUST_INDEPENDENT, TRUST_MAP

    for dimension, verifiers in TRUST_MAP.items():
        assert "api_health" not in verifiers, f"api_health가 {dimension}에 포함됨"
    assert "api_health" in TRUST_INDEPENDENT


def test_build_trust_summary_all_pass():
    """모든 verifier가 PASS일 때 모든 차원이 passed=True."""
    from teams.dev1.qc.qc_verify import _build_trust_summary

    checks = {
        "test_runner": {"status": "PASS"},
        "tdd_check": {"status": "PASS"},
        "style_check": {"status": "PASS"},
        "pyright_check": {"status": "PASS"},
        "scope_check": {"status": "PASS"},
        "schema_contract": {"status": "PASS"},
        "data_integrity": {"status": "PASS"},
        "file_check": {"status": "PASS"},
        "api_health": {"status": "PASS"},
    }
    summary = _build_trust_summary(checks)
    assert summary["Tested"]["passed"] is True
    assert summary["Readable"]["passed"] is True
    assert summary["Unified"]["passed"] is True
    assert summary["Secured"]["passed"] is True
    assert summary["Trackable"]["passed"] is True
    assert "_independent" in summary


def test_build_trust_summary_one_fail():
    """하나의 verifier가 FAIL이면 해당 차원만 passed=False."""
    from teams.dev1.qc.qc_verify import _build_trust_summary

    checks = {
        "test_runner": {"status": "FAIL"},
        "tdd_check": {"status": "PASS"},
        "style_check": {"status": "PASS"},
        "pyright_check": {"status": "PASS"},
        "scope_check": {"status": "PASS"},
        "schema_contract": {"status": "PASS"},
        "data_integrity": {"status": "PASS"},
        "file_check": {"status": "PASS"},
    }
    summary = _build_trust_summary(checks)
    assert summary["Tested"]["passed"] is False
    assert summary["Readable"]["passed"] is True


def test_build_trust_summary_skip_not_fail():
    """SKIP 상태의 verifier는 차원 실패로 간주하지 않음."""
    from teams.dev1.qc.qc_verify import _build_trust_summary

    checks = {
        "test_runner": {"status": "SKIP"},
        "tdd_check": {"status": "SKIP"},
        "style_check": {"status": "PASS"},
        "pyright_check": {"status": "PASS"},
        "scope_check": {"status": "PASS"},
        "schema_contract": {"status": "SKIP"},
        "data_integrity": {"status": "PASS"},
        "file_check": {"status": "PASS"},
    }
    summary = _build_trust_summary(checks)
    assert summary["Tested"]["passed"] is True
    assert summary["Secured"]["passed"] is True


def test_trust_summary_schema():
    """trust_summary JSON 스키마 유효성 검사."""
    from teams.dev1.qc.qc_verify import _build_trust_summary

    checks = {
        "test_runner": {"status": "PASS"},
        "tdd_check": {"status": "PASS"},
        "style_check": {"status": "PASS"},
        "pyright_check": {"status": "PASS"},
        "scope_check": {"status": "PASS"},
        "schema_contract": {"status": "PASS"},
        "data_integrity": {"status": "PASS"},
        "file_check": {"status": "PASS"},
    }
    summary = _build_trust_summary(checks)
    assert len(summary) == 6  # 5차원 + _independent
    for dim in ["Tested", "Readable", "Unified", "Secured", "Trackable"]:
        assert "verifiers" in summary[dim]
        assert "passed" in summary[dim]
        assert isinstance(summary[dim]["verifiers"], list)
        assert isinstance(summary[dim]["passed"], bool)
    assert "note" in summary["_independent"]


def test_feature_flag_off_no_trust_summary(tmp_path):
    """feature_flag OFF 시 기존 JSON 변경 없음 확인."""
    from teams.dev1.qc.qc_verify import build_result

    # 임시 feature_flags.json에서 trust5_tagging_enabled=false
    ff_dir = tmp_path / ".claude"
    ff_dir.mkdir()
    ff_file = ff_dir / "feature_flags.json"
    ff_file.write_text(json.dumps({"flags": {"trust5_tagging_enabled": False}}))

    checks = {"file_check": {"status": "PASS"}}
    orig_ws = os.environ.get("WORKSPACE_ROOT", "")
    os.environ["WORKSPACE_ROOT"] = str(tmp_path)
    try:
        result = build_result("test-task", checks)
        assert "trust_summary" not in result
    finally:
        if orig_ws:
            os.environ["WORKSPACE_ROOT"] = orig_ws
        else:
            os.environ.pop("WORKSPACE_ROOT", None)


def test_feature_flag_on_includes_trust_summary():
    """feature_flag ON 시 trust_summary 포함 확인."""
    from teams.dev1.qc.qc_verify import build_result

    # 실제 feature_flags.json에서 trust5_tagging_enabled=true (방금 활성화)
    checks = {"file_check": {"status": "PASS"}, "test_runner": {"status": "PASS"}}
    result = build_result("test-task-on", checks)
    assert "trust_summary" in result
    assert "Tested" in result["trust_summary"]


def test_mapping_coverage_original_9():
    """원본 9종 verifier 매핑 불일치율 <3% 검증."""
    from teams.dev1.qc.qc_verify import TRUST_INDEPENDENT, TRUST_MAP

    all_mapped = []
    for verifiers in TRUST_MAP.values():
        all_mapped.extend(verifiers)
    all_mapped.extend(TRUST_INDEPENDENT)

    original_9 = [
        "test_runner",
        "tdd_check",
        "style_check",
        "pyright_check",
        "scope_check",
        "schema_contract",
        "data_integrity",
        "file_check",
        "api_health",
    ]
    unmapped_original = [c for c in original_9 if c not in all_mapped]
    original_mismatch = len(unmapped_original) / len(original_9)
    assert original_mismatch < 0.03, f"원본 9종 매핑 불일치율: {original_mismatch:.1%}"
