"""8K leftover contact inspect/plan. Removal must stay blocked."""
from __future__ import annotations

import json
import tempfile
from pathlib import Path

from scripts.inspect_legacy_contact import main as inspect_cli_main
from src.domain.codegen.legacy_contact_inspect import (
    LEGACY_CONTACT_INSPECT,
    PLATFORM_LEFTOVER_RUNTIME_FILES,
    REMOVAL_MATRIX,
    assert_removal_precondition_failed,
    inspect_legacy_contact_batch,
    inspect_legacy_contact_report,
    leftover_runtime_files_present,
)
from src.domain.codegen.legacy_contact_runtime import (
    LEGACY_CONTACT_RUNTIME,
    leftover_runtime_removable,
)
from src.domain.codegen.port_adapter import install_catalog_adapters
from src.domain.connectors.invoke_capabilities import (
    CAPABILITY_CONVERSION_PATTERN,
    FORMS_FAMILY_PLAN,
)

ROOT = Path(__file__).resolve().parents[1]


def test_8k_inspect_contract_blocks_removal() -> None:
    assert LEGACY_CONTACT_INSPECT["slice_id"] == "8k_legacy_contact_inspect_and_plan"
    assert LEGACY_CONTACT_INSPECT["status"] == "complete"
    assert LEGACY_CONTACT_INSPECT["removal_brief_executed"] is False
    assert LEGACY_CONTACT_INSPECT["legacy_runtime_removal_ready"] is False
    assert LEGACY_CONTACT_INSPECT["apply_allowed"] is False
    assert LEGACY_CONTACT_INSPECT["phase_8_closure_status"] == "not_accepted"
    assert LEGACY_CONTACT_RUNTIME["legacy_runtime_removal_ready"] is False
    assert leftover_runtime_removable() is False
    assert_removal_precondition_failed()
    assert leftover_runtime_files_present(ROOT) is True
    for rel in PLATFORM_LEFTOVER_RUNTIME_FILES:
        assert (ROOT / rel).is_file()
    assert all(row["action_8k"] == "retain" for row in REMOVAL_MATRIX)
    assert CAPABILITY_CONVERSION_PATTERN["phase_8k_status"] == "complete"
    assert CAPABILITY_CONVERSION_PATTERN["next_program_slice"] == (
        "9_app_block_modernization"
    )
    assert FORMS_FAMILY_PLAN["next_slice"] == "9_app_block_modernization"


def test_inspect_report_is_dry_run() -> None:
    with tempfile.TemporaryDirectory() as raw:
        install_catalog_adapters(raw, "html", {"legacy_contact_submit": False})
        report = inspect_legacy_contact_report(raw)
        assert report["apply_allowed"] is False
        assert report["send"] is False
        assert report["removal_gate_passed"] is False
        assert report["inspection"]["project_class"] == "canonical"
        assert report["plan"]["apply_allowed"] is False


def test_inspect_batch_counts_supplied_clones_only() -> None:
    with tempfile.TemporaryDirectory() as raw:
        root = Path(raw)
        canonical = root / "canonical"
        leftover = root / "leftover"
        canonical.mkdir()
        leftover.mkdir()
        install_catalog_adapters(str(canonical), "html", {"legacy_contact_submit": False})
        submit = leftover / "functions" / "api"
        submit.mkdir(parents=True)
        (submit / "contact.js").write_text("// leftover\n", encoding="utf-8")
        (leftover / "pages").mkdir()
        (leftover / "pages" / "contact.html").write_text(
            "fetch('/api/contact', { method: 'POST' })\n",
            encoding="utf-8",
        )
        batch = inspect_legacy_contact_batch([str(canonical), str(leftover)])
        assert batch["repo_count"] == 2
        assert batch["apply_allowed"] is False
        assert batch["platform_live_fleet"] == "still_unmeasured"
        assert batch["project_class_counts"]["canonical"] == 1
        assert batch["project_class_counts"]["legacy_active"] == 1


def test_cli_writes_json_and_rejects_apply() -> None:
    with tempfile.TemporaryDirectory() as raw:
        install_catalog_adapters(raw, "html", {"legacy_contact_submit": False})
        out = Path(raw) / "report.json"
        assert inspect_cli_main(["--repo", raw, "--out", str(out)]) == 0
        payload = json.loads(out.read_text(encoding="utf-8"))
        assert payload["apply_allowed"] is False
        assert inspect_cli_main(["--repo", raw, "--apply"]) == 2
