"""8J leftover contact runtime migration / removal readiness."""
from __future__ import annotations

import tempfile
from pathlib import Path

from src.domain.codegen.legacy_contact_runtime import (
    BEHAVIORAL_EQUIVALENCE,
    LEGACY_CONTACT_RUNTIME,
    REMOVAL_GATE,
    RETAINED_EXECUTION,
    SYNTHETIC_FIXTURES,
    inspect_legacy_contact_runtime,
    leftover_runtime_removable,
    merge_contact_overrides_into_manifest,
    plan_legacy_contact_migration,
    shadow_admin_payload,
)
from src.domain.codegen.port_adapter import install_catalog_adapters
from src.domain.connectors.invoke_capabilities import (
    CAPABILITY_CONVERSION_PATTERN,
    FORMS_FAMILY_PLAN,
)
from src.domain.forms.contact_notifications import expected_forms_email_send_count


def test_8j_readiness_contract() -> None:
    assert LEGACY_CONTACT_RUNTIME["slice_id"] == (
        "8j_legacy_contact_runtime_removal_readiness"
    )
    assert LEGACY_CONTACT_RUNTIME["status"] == "complete"
    assert LEGACY_CONTACT_RUNTIME["outcome"] == "compatibility_retention"
    assert LEGACY_CONTACT_RUNTIME["legacy_runtime_removal_ready"] is False
    assert LEGACY_CONTACT_RUNTIME["auto_migration"] is False
    assert LEGACY_CONTACT_RUNTIME["telemetry"] is False
    assert leftover_runtime_removable() is False
    assert REMOVAL_GATE["no_new_projects_generate_it"] is True
    assert REMOVAL_GATE["active_legacy_usage_measurable"] is False
    assert CAPABILITY_CONVERSION_PATTERN["phase_8j_status"] == "complete"
    assert CAPABILITY_CONVERSION_PATTERN["next_program_slice"] == (
        "9_app_block_modernization"
    )
    assert FORMS_FAMILY_PLAN["next_slice"] == "9_app_block_modernization"
    assert len(RETAINED_EXECUTION) >= 5
    assert any(row["equivalent"] is False for row in BEHAVIORAL_EQUIVALENCE)
    assert len(SYNTHETIC_FIXTURES) == 6


def test_inspect_canonical_new_install() -> None:
    with tempfile.TemporaryDirectory() as raw:
        install_catalog_adapters(raw, "html", {"legacy_contact_submit": False})
        seen = inspect_legacy_contact_runtime(raw)
        assert seen.artifact_present is False
        assert seen.route_wired is False
        assert seen.canonical_forms_present is True
        assert seen.migration_class == "already_canonical"
        assert seen.project_class == "canonical"
        plan = plan_legacy_contact_migration(raw)
        assert plan.apply_allowed is False
        assert plan.shadow_compare_only is True


def test_inspect_stale_artifact_cleanup_only() -> None:
    with tempfile.TemporaryDirectory() as raw:
        root = Path(raw)
        path = root / "functions" / "api" / "contact.js"
        path.parent.mkdir(parents=True)
        path.write_text("// leftover submit\n", encoding="utf-8")
        seen = inspect_legacy_contact_runtime(raw)
        assert seen.project_class == "legacy_present_but_unused"
        assert seen.migration_class == "cleanup_only"
        assert seen.route_wired is False
        assert seen.recent_runtime_usage == "unknown"


def test_inspect_wired_leftover_is_not_auto_migratable() -> None:
    with tempfile.TemporaryDirectory() as raw:
        root = Path(raw)
        (root / "functions" / "api").mkdir(parents=True)
        (root / "functions" / "api" / "contact.js").write_text(
            "// leftover\n", encoding="utf-8"
        )
        page = root / "js" / "contact.js"
        page.parent.mkdir(parents=True)
        page.write_text(
            "await submitContact({ name, email, message });\n",
            encoding="utf-8",
        )
        seen = inspect_legacy_contact_runtime(raw)
        assert seen.project_class == "legacy_active"
        assert seen.route_wired is True
        assert seen.migration_class == "not_migratable_yet"
        assert "auto_migration_forbidden" in seen.blockers
        assert "no_execution_telemetry" in seen.blockers


def test_custom_adapter_requires_manual_review() -> None:
    with tempfile.TemporaryDirectory() as raw:
        root = Path(raw)
        lib = root / "functions" / "_lib" / "p2hs-contact.mjs"
        lib.parent.mkdir(parents=True)
        lib.write_text("// customized leftover adapter\n", encoding="utf-8")
        (root / "functions" / "api").mkdir(parents=True)
        (root / "functions" / "api" / "contact.js").write_text("x\n", encoding="utf-8")
        (root / "pages").mkdir()
        (root / "pages" / "contact.html").write_text(
            "fetch('/api/contact', { method: 'POST' })\n",
            encoding="utf-8",
        )
        seen = inspect_legacy_contact_runtime(raw)
        assert seen.adapter_customized is True
        assert seen.migration_class == "manual_review_required"


def test_replace_all_merge_preserves_unrelated_overrides() -> None:
    current = {
        "version": 1,
        "templates": [
            {
                "template_key": "auth.magic_link",
                "subject": "Login",
                "text_body": "Use {{magic_link}}",
            }
        ],
    }
    merged = merge_contact_overrides_into_manifest(
        current,
        [
            {
                "template_key": "contact_capture.admin_notify",
                "subject": "Lead",
                "text_body": "{{name}} {{email}} {{message}}",
            }
        ],
    )
    keys = [row["template_key"] for row in merged["templates"]]
    assert "auth.magic_link" in keys
    assert "contact_capture.admin_notify" in keys


def test_shadow_compare_does_not_send_and_flags_multi_recipient() -> None:
    payload = shadow_admin_payload(
        notify_to="ops@example.com,alerts@example.com",
        email="ada@example.com",
    )
    assert payload["send"] is False
    assert payload["legacy_to_count"] == 2
    assert payload["canonical_to_count"] == 1
    assert payload["reply_to"] == "ada@example.com"


def test_synthetic_fixtures_match_forms_send_count_helper() -> None:
    both = next(item for item in SYNTHETIC_FIXTURES if item["id"] == "both")
    assert expected_forms_email_send_count(both) == 2
    admin = next(item for item in SYNTHETIC_FIXTURES if item["id"] == "admin_only")
    assert expected_forms_email_send_count(admin) == 1
