"""Tests for codegen prompt wrapper logic."""
from src.domain.codegen.prompt_wrapper import build_system_prompt, build_wrapped_prompt


def test_build_system_prompt_basic():
    prompt = build_system_prompt(
        project_type="react_app",
        instruction_content="Use TypeScript strict mode.",
    )
    assert "react_app" in prompt
    assert "TypeScript strict mode" in prompt
    assert "P2HS AI code generator" in prompt
    assert "Starter Library and Codegen ownership" in prompt
    assert "Use, then Configure, then Compose" in prompt
    assert "use_when" in prompt
    assert "proposed" in prompt
    assert "`adoption` is `authoritative`" in prompt
    assert "App Blocks own product capabilities" in prompt
    assert "p2hs/app-block-hosts.json" in prompt
    assert "Charts, calculators, and Dataset" in prompt
    assert "calculation.evaluate" in prompt
    assert "Do not reinterpret the customer's request into architecture" in prompt
    assert "Composition authority" in prompt
    assert "canonical platform identities" in prompt


def test_build_system_prompt_forbids_public_search_for_internal_contracts():
    prompt = build_system_prompt("nuxt_app", "")

    assert "Internal Platform Source Policy" in prompt
    assert "Never use a public web search" in prompt
    assert "booking payload" in prompt


def test_build_system_prompt_uses_framework_neutral_identity_names():
    prompt = build_system_prompt("nuxt_app", "")

    assert "Framework-Neutral App Identity Naming" in prompt
    assert "APP_NAME" in prompt
    assert "SITE_EMAIL" in prompt
    assert "NUXT_APP_COMPANY_NAME" in prompt


def test_build_system_prompt_includes_auth_roles_playbook():
    prompt = build_system_prompt(
        project_type="react_app",
        instruction_content="",
    )
    assert "Staff / Admin Areas" in prompt
    assert "auth.custom_roles" in prompt
    assert "`/admin`" in prompt
    assert "`/login`" in prompt
    assert "owner_provisioned_as_admin" in prompt
    assert "create **pending identities**" in prompt
    assert "Never seed a password" in prompt
    assert "single-use activation/reset link" in prompt


def test_build_system_prompt_uses_contract_staff_path():
    prompt = build_system_prompt(
        project_type="react_app",
        instruction_content="",
        platform_backend={
            "runtime_contract": {
                "routes": {
                    "admin_panel_path": "/be-admin",
                    "customer_login_path": "/signin",
                }
            }
        },
    )
    assert "`/be-admin`" in prompt
    assert "at `/be-admin`" in prompt
    assert "/admin/magic" in prompt
    assert "Do not hardcode `/admin`" in prompt
    assert "They sign in\nat `/admin`" not in prompt
    assert "**Staff dashboard:** `/admin`" not in prompt


def test_build_system_prompt_with_context():
    prompt = build_system_prompt(
        project_type="nuxt_app",
        instruction_content="Follow Nuxt conventions.",
        selected_route="/about",
        viewport="mobile",
        revision_number=5,
    )
    assert "/about" in prompt
    assert "mobile" in prompt
    assert "#5" in prompt


def test_build_system_prompt_includes_project_form_policy():
    prompt = build_system_prompt(
        project_type="nuxt_app",
        instruction_content="",
        form_policy={
            "country_mode": "include",
            "countries": ["CA", "US"],
            "default_country": "CA",
            "phone_country_selector": True,
        },
    )

    assert "Standard Form Controls" in prompt
    assert "Project Form Policy" in prompt
    assert '"CA"' in prompt
    assert "E.164" in prompt


def test_build_system_prompt_includes_the_default_form_policy():
    prompt = build_system_prompt(
        project_type="html",
        instruction_content="",
        form_policy={
            "country_mode": "all",
            "countries": [],
            "default_country": None,
            "require_subdivision": False,
            "phone_country_selector": True,
        },
    )

    assert '"country_mode": "all"' in prompt


def test_build_system_prompt_empty_instructions():
    prompt = build_system_prompt(
        project_type="html",
        instruction_content="",
    )
    assert "html" in prompt
    assert "Rules" in prompt


def test_build_system_prompt_requires_p2hs_authorship():
    prompt = build_system_prompt(
        project_type="nuxt_app",
        instruction_content="",
    )
    assert "Authored by P2HS only" in prompt
    assert "Co-authored-by: Cursor" in prompt
    assert "NEVER add" in prompt
    assert "generated Worker (user app) owns UI and thin `/api` BFF routes" in prompt
    assert "Missing Cloud configuration is an error" in prompt
    assert "never invent a local store" in prompt.lower() or "Never invent a local store" in prompt
    assert "p2hs/app-recipe.json" in prompt


def test_build_system_prompt_requires_canonical_auth_client_for_authored_ui():
    prompt = build_system_prompt("nuxt_app", "")
    assert "Generated UI auth contract" in prompt
    assert "Never write `fetch`, `$fetch`, Axios" in prompt
    assert "`me`" in prompt and "`signIn`" in prompt and "`signUp`" in prompt and "`signOut`" in prompt
    assert "outside locked platform\nfiles" in prompt and "must be removed" in prompt


def test_build_system_prompt_requires_clear_user_response():
    prompt = build_system_prompt(
        project_type="nuxt_app",
        instruction_content="",
    )
    assert "P2HS_USER_RESPONSE:" in prompt
    assert "Do NOT start with \"Changes applied\"" in prompt


def test_build_continuation_user_prompt_keeps_original_request():
    from src.domain.codegen.prompt_wrapper import build_continuation_user_prompt

    wrapped = build_continuation_user_prompt(
        "Add a booking calendar",
        attempt=2,
        max_attempts=4,
        last_summary="Created pages/book.vue",
    )
    assert "Add a booking calendar" in wrapped
    assert "continuation attempt 2 of 4" in wrapped
    assert "Do not revert" in wrapped
    assert "Created pages/book.vue" in wrapped


def test_build_agent_user_prompt_asks_for_clear_user_response():
    from src.domain.codegen.prompt_wrapper import build_agent_user_prompt

    wrapped = build_agent_user_prompt("Add MFA")
    assert "Add MFA" in wrapped
    assert "P2HS_USER_RESPONSE:" in wrapped


def test_build_wrapped_prompt():
    wrapped = build_wrapped_prompt("Add a contact page")
    assert "Add a contact page" in wrapped
    assert "User Request" in wrapped
    assert "Output Format" in wrapped
    assert "JSON plan" in wrapped
