"""How an App Block plan applies to a project generation lifecycle."""

from src.domain.app_blocks.catalogs import canonical_feature_pack
from src.domain.app_blocks.execution import assert_install_plan_installable
from src.domain.app_blocks.schemas import AppBlockPlan
from src.domain.projects.models import PROJECT_SOURCE_KIND_GENERATED

Adoption = str  # authoritative | advisory | omitted

COMPLETED_CODEGEN = frozenset({"completed", "completed_with_limitations"})


def adoption_for(*, source_kind: str, completed_codegen: bool) -> str:
    if source_kind != PROJECT_SOURCE_KIND_GENERATED:
        return "omitted"
    if completed_codegen:
        return "advisory"
    return "authoritative"


def apply_adoption(plan: AppBlockPlan, adoption: str) -> AppBlockPlan:
    return plan.model_copy(update={"adoption": adoption})


def install_and_protect_packs(plan: AppBlockPlan) -> tuple[list[str], list[str]]:
    """Packs to install now, and packs the worker must not uninstall."""
    assert_install_plan_installable(plan)
    slugs = [canonical_feature_pack(item) for item in plan.required_feature_packs]
    if plan.adoption == "omitted":
        return [], []
    if plan.adoption == "advisory":
        return [], slugs
    return slugs, slugs
