"""Release gates: new projects without a live Pages deploy use W4P. Migration stays a dry-run."""

from datetime import datetime, timezone

from scripts.golden_capabilities_fixture import PROTECTED_PROJECTS, fixture_plan
from scripts.pages_w4p_migration_dry_run import inventory_row
from src.domain.hosting.deployment_targets import deploy_workflow_for_project, generate_deploy_workflow
from src.domain.hosting.project_provider import project_hosting_provider
from scripts.release_report import build_release_report, validate_release_report


class _Settings:
    hosting_provider = "cloudflare_pages"
    hosting_platform_projects_created_after = ""
    api_url = "https://core.example"
    w4p_activation_audience = "p2hs-w4p"
    cloudflare_worker_compatibility_date = "2026-03-25"
    cloudflare_w4p_namespace_production = "p2hs-production"
    cloudflare_w4p_namespace_preview = "p2hs-preview"


def test_new_static_project_without_a_pages_deploy_uses_w4p():
    created = datetime(2026, 9, 1, tzinfo=timezone.utc)
    assert project_hosting_provider(
        created,
        _Settings(),
        assume_unassigned_w4p=True,
        has_successful_pages_deployment=False,
    ) == "cloudflare_w4p_static"
    workflow = deploy_workflow_for_project(
        "react_app",
        "pabc12345",
        created,
        _Settings(),
        assume_unassigned_w4p=True,
        has_successful_pages_deployment=False,
    )
    assert "pages deploy" not in workflow
    assert "id-token: write" in workflow


def test_successful_pages_project_stays_on_pages():
    created = datetime(2026, 9, 1, tzinfo=timezone.utc)
    assert project_hosting_provider(
        created,
        _Settings(),
        primary_hosting_provider="cloudflare_pages",
        assume_unassigned_w4p=True,
        has_successful_pages_deployment=True,
    ) == "cloudflare_pages"
    assert deploy_workflow_for_project(
        "nuxt_app",
        "pabc12345",
        created,
        _Settings(),
        has_successful_pages_deployment=True,
    ) == generate_deploy_workflow("nuxt_app", "pabc12345")


def test_capabilities_fixture_refuses_protected_goldens_and_cleans_up():
    for project_id in PROTECTED_PROJECTS:
        try:
            fixture_plan(project_id)
        except ValueError as exc:
            assert str(exc) == "protected_golden_project"
        else:
            raise AssertionError("protected project was accepted")
    plan = fixture_plan("11111111-1111-1111-1111-111111111111")
    assert plan["mode"] == "dry_run"
    assert plan["residual_rows_allowed"] is False
    assert plan["residual_policy"]["active_test_data"] == 0
    assert plan["residual_policy"]["retained_lifecycle_metadata"] == "soft_disabled_schema_registrations"
    assert "delete_entity_schema_rows" in plan["cleanup"]


def test_pages_migration_row_cannot_delete():
    row = inventory_row(
        project_id="p",
        project_ref="pref",
        pages_project_name="p2hs-pref",
        preview_hostname="prev-pref.p2hsapp.com",
        live_hostname="proj-pref.p2hsapp.com",
        custom_domains=["app.example.com"],
        has_functions_api=True,
        has_server_api=False,
    )
    assert row["action"] == "dry_run"
    assert row["pages_delete"] is False
    assert row["kv_write"] is False
    assert row["repo_has_functions_api"] is True


def test_release_report_blocks_skipped_gate_or_unverified_dispatcher():
    gates = {name: {"status": "passed"} for name in ("A", "B", "C", "Security", "Rollback")}
    report = build_release_report(
        core_commit="core", cloud_commit="cloud", gateway_version="gw",
        dispatcher_version=None, worker_version="worker", port_catalog_fingerprint="ports",
        test_project="fixture", test_environment="preview", gates=gates,
    )
    assert report["release_ready"] is False
    assert "dispatcher_version_unverified" in report["blocking_conditions"]

    skipped = dict(gates)
    skipped["Rollback"] = {"status": "skipped"}
    report = build_release_report(
        core_commit="core", cloud_commit="cloud", gateway_version="gw",
        dispatcher_version="dispatcher", worker_version="worker", port_catalog_fingerprint="ports",
        test_project="fixture", test_environment="preview", gates=skipped,
    )
    assert report["release_ready"] is False
    validate_release_report(report)
