from src.domain.codegen.contact_adapter import contact_adapter_files
from src.domain.codegen.port_adapter import catalog_adapter_files, LOCK_PATH
from src.workers.tasks.env_sync import _with_platform_env_vars
from types import SimpleNamespace
import json


def test_contact_adapter_is_projected_for_html():
    files = catalog_adapter_files("html")
    assert "functions/api/contact.js" not in files
    assert "functions/api/public-config.js" in files
    assert "functions/_lib/p2hs-contact.mjs" in files
    lock = json.loads(files[LOCK_PATH])
    assert "/api/contact" not in lock["routes"]
    assert lock["legacy_contact_submit"] is False
    assert "/api/public-config" in lock["routes"]
    assert "submitContact" in files["functions/_lib/p2hs-contact.mjs"]
    assert 'from "../_lib/p2hs-contact.mjs"' in files["functions/api/public-config.js"]
    assert 'from "./p2hs-records.mjs"' in files["functions/_lib/p2hs-contact.mjs"]
    assert "functions/api/auth/magic-link/consume.js" in files
    assert "functions/api/contact/inbox.js" in files
    assert "/api/auth/magic-link/consume" in lock["routes"]
    assert "/api/contact/inbox" in lock["routes"]
    consume = files["functions/api/auth/magic-link/consume.js"]
    assert 'from "../../../_lib/p2hs-auth-magic.mjs"' in consume
    assert "consumeMagicLink" in consume
    assert "platformRequest" not in consume
    assert 'from "../../_lib/p2hs-contact.mjs"' in files["functions/api/contact/inbox.js"]
    assert "contact-notify:" in files["functions/_lib/p2hs-contact.mjs"]

    leftover = catalog_adapter_files("html", {"legacy_contact_submit": True})
    assert "functions/api/contact.js" in leftover
    assert "/api/contact" in json.loads(leftover[LOCK_PATH])["routes"]
    assert 'from "../_lib/p2hs-contact.mjs"' in leftover["functions/api/contact.js"]
    assert "../../_lib/p2hs-contact.mjs" not in leftover["functions/api/contact.js"]


def test_catalog_keeps_the_magic_link_handoff_for_nuxt():
    files = catalog_adapter_files("nuxt_app")
    route = files["server/api/auth/magic-link/consume.get.ts"]
    assert "consumeMagicLink" in route
    assert "platformRequest" not in route


def test_contact_adapter_is_installed_for_nuxt():
    files = contact_adapter_files("nuxt_app")
    assert "server/api/contact.post.ts" in files
    canonical = contact_adapter_files("nuxt_app", include_submit_route=False)
    assert "server/api/contact.post.ts" not in canonical
    assert "server/api/public-config.get.ts" in canonical
    assert "server/api/contact/inbox.get.ts" in files
    assert "server/api/auth/magic-link/consume.get.ts" in files
    assert 'from "../utils/p2hs-contact.mjs"' in files["server/api/contact.post.ts"]
    assert 'from "../utils/p2hs-contact.mjs"' in files["server/api/public-config.get.ts"]
    assert "../../utils/p2hs-contact.mjs" not in files["server/api/contact.post.ts"]
    assert "../../utils/p2hs-contact.mjs" not in files["server/api/public-config.get.ts"]
    assert 'from "../../utils/p2hs-contact.mjs"' in files["server/api/contact/inbox.get.ts"]
    assert 'from "../../../utils/p2hs-auth-magic.mjs"' in files["server/api/auth/magic-link/consume.get.ts"]


def test_generated_app_turnstile_env_is_injected(monkeypatch):
    monkeypatch.setattr(
        "src.config.get_settings",
        lambda: SimpleNamespace(
            cloud_public_api_url="https://cloud.example",
            cloud_control_api_url="",
            api_url="https://api.example",
            generated_app_turnstile_site_key="0xpublic",
            generated_app_turnstile_secret="0xsecret",
        ),
    )
    out = _with_platform_env_vars(
        [],
        project_id="proj-1",
        client_id=None,
        service_token="tok",
    )
    by_key = {row["key"]: row for row in out}
    assert by_key["TURNSTILE_SITE_KEY"]["value"] == "0xpublic"
    assert by_key["TURNSTILE_SITE_KEY"]["visibility"] == "public"
    assert by_key["TURNSTILE_SECRET"]["value"] == "0xsecret"
    assert by_key["TURNSTILE_SECRET"]["visibility"] == "secret"
