"""p2hs-forms.mjs -- the generic public-create primitive Level 1 composition needs
for anonymous-create requirements (quote request, job application, etc.)."""
from __future__ import annotations

from src.domain.codegen.backend_guard import validate_backend_repo
from src.domain.codegen.forms_adapter import forms_adapter_files, retire_legacy_form_route_aliases


def test_installs_shared_adapter_for_every_pages_type():
    for project_type in ("html", "react_app", "nuxt_app"):
        files = forms_adapter_files(project_type)
        assert "functions/_lib/p2hs-forms.mjs" in files
        assert "submitFormEntry" in files["functions/_lib/p2hs-forms.mjs"]
        assert "functions/_lib/p2hs-forms-runtime.mjs" in files
        assert "functions/_lib/p2hs-forms-submit.mjs" in files
        assert "functions/api/forms/[formKey]/submissions.js" in files
        assert "functions/api/forms/[formKey]/files.js" in files
    nuxt = forms_adapter_files("nuxt_app")
    assert "server/utils/p2hs-forms.mjs" in nuxt
    assert "server/api/forms/[formKey]/submissions.post.ts" in nuxt
    assert "server/api/forms/[formKey]/files.post.ts" in nuxt
    assert "server/utils/p2hs-forms.mjs" not in forms_adapter_files("html")


def test_not_installed_for_non_pages_project_types():
    assert forms_adapter_files("shopify_app") == {}


def test_never_reads_entity_key_or_fields_from_the_request():
    """The whole safety property: a caller must not be able to target an entity or
    field the composer didn't declare -- both come from the route's own closure,
    never from `body`."""
    source = forms_adapter_files("html")["functions/_lib/p2hs-forms.mjs"]
    assert "body.entityKey" not in source
    assert "body[entityKey]" not in source


def test_platform_marker_file_passes_the_guard():
    import tempfile
    from pathlib import Path

    with tempfile.TemporaryDirectory() as raw:
        root = Path(raw)
        for name, content in forms_adapter_files("nuxt_app").items():
            target = root / name
            target.parent.mkdir(parents=True, exist_ok=True)
            target.write_text(content, encoding="utf-8")
        validate_backend_repo(raw)


def test_retire_legacy_snake_case_routes_before_w4p_bundling():
    import tempfile
    from pathlib import Path

    with tempfile.TemporaryDirectory() as raw:
        root = Path(raw)
        legacy = root / "functions/api/forms/[form_key]/files.js"
        legacy.parent.mkdir(parents=True, exist_ok=True)
        legacy.write_text("legacy", encoding="utf-8")

        retired = retire_legacy_form_route_aliases(raw)

        assert not legacy.exists()
        assert ".p2hs/local-bak/functions/api/forms/[form_key]/files.js" in retired


def test_w4p_catalog_install_retires_aliases_when_runtime_files_are_filtered():
    import tempfile
    from pathlib import Path

    from src.domain.codegen.port_adapter import install_catalog_adapters
    from src.domain.hosting.project_provider import W4P_STATIC

    with tempfile.TemporaryDirectory() as raw:
        root = Path(raw)
        legacy = root / "functions/api/forms/[form_key]/files.js"
        legacy.parent.mkdir(parents=True, exist_ok=True)
        legacy.write_text("legacy", encoding="utf-8")

        result = install_catalog_adapters(
            raw,
            "react_app",
            {"hosting_provider": W4P_STATIC, "legacy_contact_submit": False},
        )

        assert not legacy.exists()
        assert ".p2hs/local-bak/functions/api/forms/[form_key]/files.js" in result[
            "retired_form_aliases"
        ]
