from types import SimpleNamespace
from uuid import uuid4

import pytest
from src.domain.capabilities.adapters import FormsProvisioner
from src.domain.capabilities.lifecycle import (
    CapabilityState,
    CapabilityStatus,
)


class _EmptyResult:
    def scalars(self):
        return SimpleNamespace(all=lambda: [])

    def scalar_one_or_none(self):
        return None


class _NoPacksNoProjectDB:
    """No installed Feature Packs and no discoverable project -- the composition
    resolver sees zero form binding sources, same as a project with nothing
    installed yet."""

    async def execute(self, _query):
        return _EmptyResult()


def test_lifecycle_status_is_normalized_without_replacing_domain_state():
    status = CapabilityStatus(
        capability="feature_packs",
        version=1,
        state=CapabilityState.DRIFTED,
        drift=True,
        details={"required_action": "reinstall_pack"},
    )

    assert status.capability == "feature_packs"
    assert status.state == CapabilityState.DRIFTED


@pytest.mark.asyncio
async def test_forms_adapter_is_declared_with_no_installed_form_bindings():
    status = await FormsProvisioner(_NoPacksNoProjectDB()).status(uuid4())

    assert status.capability == "forms"
    assert status.version == 1
    assert status.state == CapabilityState.DECLARED
    assert status.details["contract_status"] == "frozen"
    assert status.details["forms"] == []
