"""Phase 11D8C freeze locks for the 11D8A/B ownership contract."""
from __future__ import annotations

from pathlib import Path

import pytest
from src.domain.feature_packs.composer import derive_pack_composition
from src.domain.feature_packs.normalize import stamp_composition
from src.domain.feature_packs.ownership import OwnershipContractError
from src.domain.feature_packs.requirements_spec import CompositionRequirement

from tests.test_ownership_contract_11d8b import _composition, _entity, _install
from tests.test_phase11_pack_migration_materialization import _captured_composition

REPO = Path(__file__).resolve().parents[1]


@pytest.mark.asyncio
async def test_freeze_install_rejects_without_cloud_writes():
    result, cloud = await _install(_composition(_entity(key="ownership_bad_fixture")))
    assert result["status"] == "blocked"
    assert result["blocker"]["validation_code"] == "INVALID_OWNERSHIP_CONTRACT"
    cloud.create_project_entity.assert_not_called()
    cloud.patch_project_entity.assert_not_called()


def test_freeze_documents_and_notifications_remain_admitted():
    documents = _captured_composition(
        "alembic/versions/142_documents_lifecycle_pack.py", "documents-lifecycle"
    )
    notifications = _captured_composition(
        "alembic/versions/140_notifications_in_app_pack.py", "notifications-in-app"
    )
    stamp_composition("documents-lifecycle", documents)
    stamp_composition("notifications-in-app", notifications)
    assert documents["entities"][0]["rls_enabled"] is True
    member = notifications["entities"][0]["schema"]["access_policy"]["roles"]["member"]
    assert "create" not in member
    assert member["read"]["scope"] == "owner"


def test_freeze_generated_member_owned_accepted_contradiction_blocked():
    req = CompositionRequirement.model_validate(
        {
            "name": "member_note",
            "actors": ["member", "admin"],
            "requirements": [
                {"action": "create", "resource": "member_note", "actor": "member"},
                {"action": "read", "resource": "member_note", "actor": "member"},
                {"action": "read", "resource": "member_note", "actor": "admin"},
            ],
            "fields": [{"key": "title", "label": "Title", "type": "text", "required": True}],
        }
    )
    spec = derive_pack_composition(req, "p11d8c")
    assert spec.entities[0].rls_enabled is True
    with pytest.raises(OwnershipContractError):
        stamp_composition(
            "local-p11d8c-bad",
            _composition(_entity(key="generated_bad", rls=False, owner_managed=False)),
        )


def test_freeze_no_new_ownership_primitive_or_documents_special_case():
    src = (REPO / "src/domain/feature_packs/ownership.py").read_text(encoding="utf-8")
    lowered = src.lower()
    for token in ("ownership.creation", "creator_owns", "assignment_owner", "post-create"):
        assert token not in lowered
    assert "document" not in lowered
    assert "def validate_composition_ownership_contracts" in src
    assert "INVALID_OWNERSHIP_CONTRACT" in src
