"""contact-capture install: Core-resolved form fields must win over a fresh agent
declaration, while a legacy/previously-persisted configuration survives until
Core has actually resolved a replacement for that form_key."""
from types import SimpleNamespace
from unittest.mock import AsyncMock, MagicMock
from uuid import uuid4

import pytest
from src.domain.feature_packs.service import PackInstallService


def _service(*, previous_config: dict, resolved: dict) -> PackInstallService:
    pack = SimpleNamespace(
        id=uuid4(), slug="contact-capture", status="active", version="1.0.0",
        composition={}, input_schema=None,
    )
    svc = PackInstallService(AsyncMock(), MagicMock(), AsyncMock())
    svc._get_pack_by_slug = AsyncMock(return_value=pack)
    svc._installed_config = AsyncMock(return_value=previous_config)
    svc._resolved_form_definitions = AsyncMock(return_value=resolved)
    svc._missing_prerequisites = AsyncMock(return_value=([], []))
    svc._workspace_owner_email = AsyncMock(return_value="")
    svc._persist_contact_notify_env = AsyncMock()
    svc._upsert_install_state = AsyncMock()
    return svc


@pytest.mark.asyncio
async def test_core_resolved_fields_override_fresh_agent_declaration():
    svc = _service(
        previous_config={},
        resolved={
            "quote_request": {
                "key": "quote_request", "fields": [{"key": "phone", "type": "phone"}]
            }
        },
    )
    agent_declared = {
        "form_definitions": {
            "quote_request": {
                "key": "quote_request", "fields": [{"key": "made_up_by_agent", "type": "text"}]
            }
        }
    }
    await svc.install_pack(project_id=uuid4(), pack_slug="contact-capture", config=agent_declared)

    _, kwargs = svc._upsert_install_state.call_args
    fields = kwargs["config"]["form_definitions"]["quote_request"]["fields"]
    assert [f["key"] for f in fields] == ["phone"]


@pytest.mark.asyncio
async def test_legacy_config_survives_when_core_has_no_resolution_yet():
    legacy = {
        "key": "contact",
        "fields": [{"key": "message", "type": "textarea", "required": True}],
    }
    svc = _service(previous_config={"form_definitions": {"contact": legacy}}, resolved={})

    await svc.install_pack(project_id=uuid4(), pack_slug="contact-capture", config={})

    _, kwargs = svc._upsert_install_state.call_args
    assert kwargs["config"]["form_definitions"]["contact"] == legacy


@pytest.mark.asyncio
async def test_core_resolution_merges_alongside_untouched_legacy_form_key():
    legacy_contact = {
        "key": "contact",
        "fields": [{"key": "message", "type": "textarea", "required": True}],
    }
    resolved_quote = {"key": "quote_request", "fields": [{"key": "phone", "type": "phone"}]}
    svc = _service(
        previous_config={"form_definitions": {"contact": legacy_contact}},
        resolved={"quote_request": resolved_quote},
    )

    await svc.install_pack(project_id=uuid4(), pack_slug="contact-capture", config={})

    _, kwargs = svc._upsert_install_state.call_args
    form_definitions = kwargs["config"]["form_definitions"]
    assert form_definitions["contact"] == legacy_contact
    assert form_definitions["quote_request"] == resolved_quote


@pytest.mark.asyncio
async def test_no_previous_and_no_resolution_leaves_form_definitions_absent():
    svc = _service(previous_config={}, resolved={})

    await svc.install_pack(project_id=uuid4(), pack_slug="contact-capture", config={})

    _, kwargs = svc._upsert_install_state.call_args
    assert "form_definitions" not in kwargs["config"]
