"""Thin archetype Starter family. Shell metadata only — no private backends.

Starter Library contracts (`form.standard`, `record.table`, …) stay the
presentation primitives. These archetypes are disposable application shells
that host Feature Packs and App Blocks.
"""

from __future__ import annotations

from pydantic import BaseModel, ConfigDict, Field

STARTER_FAMILY_VERSION = "1"


class StarterNavItem(BaseModel):
    model_config = ConfigDict(extra="forbid")
    id: str
    label: str
    href: str
    surface: str = "staff"


class StarterRoute(BaseModel):
    model_config = ConfigDict(extra="forbid")
    path: str
    title: str
    primary_block: str | None = None
    surface: str = "staff"
    emphasis: str = "records"


class ArchetypeStarter(BaseModel):
    model_config = ConfigDict(extra="forbid")
    id: str
    version: str = STARTER_FAMILY_VERSION
    archetype: str
    supported_surfaces: list[str] = Field(default_factory=list)
    default_navigation: list[StarterNavItem] = Field(default_factory=list)
    default_routes: list[StarterRoute] = Field(default_factory=list)
    default_job_packs: list[str] = Field(default_factory=list)
    optional_job_packs: list[str] = Field(default_factory=list)
    required_capabilities: list[str] = Field(default_factory=list)
    forbidden_implicit_capabilities: list[str] = Field(default_factory=list)
    primary_route: str = "/admin"
    workflow_emphasis: str = "records"


_FORBIDDEN_COMMERCE = (
    "saas-membership",
    "membership.portal",
)
_FORBIDDEN_MEMBERSHIP_INFER = (
    "membership.member",
    "saas-membership",
    "membership.portal",
)
_FORBIDDEN_FIELD_ENGINES = (
    "payments.checkout",
    "saas-membership",
    "membership.portal",
    "private_vertical_backend",
)


def _nav(*items: tuple[str, str, str, str]) -> list[StarterNavItem]:
    return [
        StarterNavItem(id=item[0], label=item[1], href=item[2], surface=item[3])
        for item in items
    ]


def _routes(*items: tuple[str, str, str | None, str, str]) -> list[StarterRoute]:
    return [
        StarterRoute(
            path=item[0],
            title=item[1],
            primary_block=item[2],
            surface=item[3],
            emphasis=item[4],
        )
        for item in items
    ]


def _starter(
    starter_id: str,
    *,
    surfaces: list[str],
    nav: list[StarterNavItem],
    routes: list[StarterRoute],
    packs: list[str],
    optional: list[str] | None = None,
    capabilities: list[str],
    forbidden: tuple[str, ...] = _FORBIDDEN_COMMERCE,
    primary: str,
    emphasis: str,
) -> ArchetypeStarter:
    return ArchetypeStarter(
        id=starter_id,
        archetype=starter_id,
        supported_surfaces=surfaces,
        default_navigation=nav,
        default_routes=routes,
        default_job_packs=packs,
        optional_job_packs=list(optional or []),
        required_capabilities=capabilities,
        forbidden_implicit_capabilities=list(forbidden),
        primary_route=primary,
        workflow_emphasis=emphasis,
    )


ARCHETYPE_STARTERS: dict[str, ArchetypeStarter] = {
    "crm_sales": _starter(
        "crm_sales",
        surfaces=["staff"],
        nav=_nav(
            ("dashboard", "Dashboard", "/admin", "staff"),
            ("customers", "Customers", "/admin/customers", "staff"),
            ("pipeline", "Pipeline", "/admin/pipeline", "staff"),
            ("leads", "Leads", "/admin/leads", "staff"),
            ("tasks", "Tasks", "/admin/tasks", "staff"),
            ("activity", "Activity", "/admin/activity", "staff"),
        ),
        routes=_routes(
            ("/admin", "Sales dashboard", None, "staff", "pipeline"),
            ("/admin/customers", "Customers", "crm.customer", "staff", "accounts"),
            ("/admin/pipeline", "Pipeline", "crm.pipeline", "staff", "pipeline"),
            ("/admin/leads", "Leads", "crm.lead", "staff", "intake"),
            ("/admin/tasks", "Tasks", "task.management", "staff", "follow_up"),
            ("/admin/activity", "Activity", "activity.timeline", "staff", "activity"),
        ),
        packs=["crm_sales_operations", "customer_success_operations"],
        optional=["crm_booking_operations"],
        capabilities=["crm.customer", "crm.lead", "crm.pipeline"],
        primary="/admin/pipeline",
        emphasis="pipeline",
    ),
    "case_operations": _starter(
        "case_operations",
        surfaces=["staff"],
        nav=_nav(
            ("cases", "Cases", "/admin/cases", "staff"),
            ("queue", "Status queue", "/admin/cases?view=status", "staff"),
            ("tasks", "Tasks", "/admin/tasks", "staff"),
            ("documents", "Documents", "/admin/documents", "staff"),
            ("activity", "Timeline", "/admin/activity", "staff"),
        ),
        routes=_routes(
            ("/admin/cases", "Cases", "case.management", "staff", "status_queue"),
            ("/admin/cases/:id", "Case detail", "case.management", "staff", "case_detail"),
            ("/admin/tasks", "Assignments", "task.management", "staff", "assignments"),
            ("/admin/documents", "Documents", "documents", "staff", "evidence"),
            ("/admin/activity", "Timeline", "activity.timeline", "staff", "timeline"),
        ),
        packs=["case_operations"],
        optional=["support_operations", "education_certification"],
        capabilities=["case.management"],
        primary="/admin/cases",
        emphasis="status_queue",
    ),
    "membership_association": _starter(
        "membership_association",
        surfaces=["staff"],
        nav=_nav(
            ("members", "Members", "/admin/members", "staff"),
            ("customers", "Contacts", "/admin/customers", "staff"),
            ("documents", "Documents", "/admin/documents", "staff"),
            ("tasks", "Operations", "/admin/tasks", "staff"),
        ),
        routes=_routes(
            ("/admin/members", "Membership roster", "membership.member", "staff", "roster"),
            ("/admin/customers", "Contacts", "crm.customer", "staff", "accounts"),
            ("/admin/documents", "Documents", "documents", "staff", "records"),
            ("/admin/tasks", "Operations", "task.management", "staff", "operations"),
        ),
        packs=["association_management"],
        capabilities=["membership.member", "crm.customer"],
        forbidden=_FORBIDDEN_COMMERCE,
        primary="/admin/members",
        emphasis="roster",
    ),
    "service_field": _starter(
        "service_field",
        surfaces=["staff"],
        nav=_nav(
            ("jobs", "Jobs", "/admin/jobs", "staff"),
            ("schedule", "Schedule", "/admin/schedule", "staff"),
            ("customers", "Customers", "/admin/customers", "staff"),
            ("tasks", "Tasks", "/admin/tasks", "staff"),
            ("invoices", "Invoices", "/admin/invoices", "staff"),
            ("files", "Files", "/admin/files", "staff"),
        ),
        routes=_routes(
            ("/admin/jobs", "Service jobs", "case.management", "staff", "jobs"),
            ("/admin/schedule", "Schedule", "booking.appointment", "staff", "schedule"),
            ("/admin/customers", "Customers", "crm.customer", "staff", "accounts"),
            ("/admin/tasks", "Field tasks", "task.management", "staff", "dispatch_tasks"),
            ("/admin/invoices", "Invoices", "billing.invoice", "staff", "invoices"),
            ("/admin/files", "Job files", "files.attachments", "staff", "evidence"),
        ),
        packs=["field_service_operations"],
        capabilities=["crm.customer", "case.management", "booking.appointment"],
        forbidden=_FORBIDDEN_FIELD_ENGINES,
        primary="/admin/jobs",
        emphasis="jobs",
    ),
    "booking": _starter(
        "booking",
        surfaces=["staff", "public"],
        nav=_nav(
            ("calendar", "Appointments", "/admin/appointments", "staff"),
            ("book", "Book", "/book", "public"),
            ("customers", "Customers", "/admin/customers", "staff"),
            ("tasks", "Tasks", "/admin/tasks", "staff"),
        ),
        routes=_routes(
            ("/book", "Book an appointment", "booking.appointment", "public", "booking"),
            ("/admin/appointments", "Appointments", "booking.appointment", "staff", "calendar"),
            ("/admin/customers", "Customers", "crm.customer", "staff", "accounts"),
            ("/admin/tasks", "Tasks", "task.management", "staff", "follow_up"),
        ),
        packs=["booking_operations"],
        optional=["crm_booking_operations"],
        capabilities=["booking.appointment"],
        primary="/admin/appointments",
        emphasis="calendar",
    ),
    "catalog_orders": _starter(
        "catalog_orders",
        surfaces=["staff", "client"],
        nav=_nav(
            ("orders", "Orders", "/admin/orders", "staff"),
            ("catalog", "Catalog", "/admin/catalog", "staff"),
            ("customers", "Customers", "/admin/customers", "staff"),
            ("inventory", "Inventory", "/admin/inventory", "staff"),
            ("invoices", "Invoices", "/admin/invoices", "staff"),
        ),
        routes=_routes(
            ("/admin/orders", "Orders", "orders.order", "staff", "orders"),
            ("/admin/catalog", "Catalog", "catalog.product", "staff", "catalog"),
            ("/admin/customers", "Customers", "crm.customer", "staff", "accounts"),
            ("/admin/inventory", "Inventory", "inventory.stock", "staff", "stock"),
            ("/admin/invoices", "Invoices", "billing.invoice", "staff", "invoices"),
        ),
        packs=["catalog_order_operations", "b2b_order_portal"],
        capabilities=["catalog.product", "orders.order"],
        forbidden=_FORBIDDEN_COMMERCE,
        primary="/admin/orders",
        emphasis="orders",
    ),
    "document_heavy": _starter(
        "document_heavy",
        surfaces=["staff"],
        nav=_nav(
            ("documents", "Documents", "/admin/documents", "staff"),
            ("files", "Files", "/admin/files", "staff"),
            ("review", "Review", "/admin/approvals", "staff"),
            ("tasks", "Tasks", "/admin/tasks", "staff"),
        ),
        routes=_routes(
            ("/admin/documents", "Documents", "documents", "staff", "repository"),
            ("/admin/files", "Files", "files.attachments", "staff", "files"),
            ("/admin/approvals", "Review", "workflow.approval", "staff", "review"),
            ("/admin/tasks", "Tasks", "task.management", "staff", "follow_up"),
        ),
        packs=["document_control", "board_governance", "committee_management"],
        capabilities=["documents", "files.attachments"],
        forbidden=_FORBIDDEN_MEMBERSHIP_INFER,
        primary="/admin/documents",
        emphasis="repository",
    ),
    "compliance_audit": _starter(
        "compliance_audit",
        surfaces=["staff"],
        nav=_nav(
            ("findings", "Findings", "/admin/findings", "staff"),
            ("documents", "Evidence", "/admin/documents", "staff"),
            ("approvals", "Reviews", "/admin/approvals", "staff"),
            ("tasks", "Actions", "/admin/tasks", "staff"),
        ),
        routes=_routes(
            ("/admin/findings", "Findings", "case.management", "staff", "findings"),
            ("/admin/documents", "Evidence", "documents", "staff", "evidence"),
            ("/admin/approvals", "Reviews", "workflow.approval", "staff", "review"),
            ("/admin/tasks", "Corrective actions", "task.management", "staff", "capa_tasks"),
        ),
        packs=["case_operations"],
        capabilities=["case.management", "documents"],
        forbidden=_FORBIDDEN_COMMERCE,
        primary="/admin/findings",
        emphasis="findings",
    ),
    "client_portal": _starter(
        "client_portal",
        surfaces=["client", "staff"],
        nav=_nav(
            ("home", "Workspace", "/", "client"),
            ("documents", "Documents", "/documents", "client"),
            ("approvals", "Approvals", "/approvals", "client"),
            ("tasks", "Tasks", "/tasks", "client"),
            ("profile", "Profile", "/profile", "client"),
            ("staff", "Staff", "/admin", "staff"),
        ),
        routes=_routes(
            ("/", "Client home", None, "client", "portal_home"),
            ("/documents", "Documents", "documents", "client", "client_docs"),
            ("/approvals", "Approvals", "workflow.approval", "client", "client_review"),
            ("/tasks", "Tasks", "task.management", "client", "client_tasks"),
            ("/profile", "Profile", "auth.profile", "client", "profile"),
            ("/login", "Sign in", "auth.sign_in", "public", "auth"),
        ),
        packs=["client_portal_operations", "client_onboarding"],
        capabilities=["auth.sign_in", "documents", "workflow.approval"],
        forbidden=("portal.portal", "membership.portal", "saas-membership", "payments.checkout"),
        primary="/documents",
        emphasis="client_docs",
    ),
    "application_portal": _starter(
        "application_portal",
        surfaces=["public", "client", "staff"],
        nav=_nav(
            ("apply", "Application", "/apply", "public"),
            ("status", "My application", "/application", "client"),
            ("requirements", "Requirements", "/application/requirements", "client"),
            ("conversation", "Messages", "/application/messages", "client"),
            ("review", "Review queue", "/admin/applications", "staff"),
        ),
        routes=_routes(
            ("/apply", "Application", "forms.contact", "public", "intake"),
            ("/application", "Application status", "case.management", "client", "status"),
            ("/application/requirements", "Requirements", "requirements.checklist", "client", "evidence"),
            ("/application/messages", "Messages", "collaboration.conversation", "client", "conversation"),
            ("/admin/applications", "Applications", "case.management", "staff", "review"),
        ),
        packs=["case_operations", "client_onboarding"],
        optional=["document_control"],
        capabilities=["case.management", "requirements.checklist", "collaboration.conversation"],
        forbidden=_FORBIDDEN_COMMERCE + ("student_admissions_backend", "student_consultancy_backend"),
        primary="/admin/applications",
        emphasis="application_review",
    ),
    "internal_operations": _starter(
        "internal_operations",
        surfaces=["staff"],
        nav=_nav(
            ("dashboard", "Operations", "/admin", "staff"),
            ("tasks", "Tasks", "/admin/tasks", "staff"),
            ("approvals", "Approvals", "/admin/approvals", "staff"),
            ("documents", "Documents", "/admin/documents", "staff"),
            ("records", "Records", "/admin/records", "staff"),
        ),
        routes=_routes(
            ("/admin", "Operations dashboard", None, "staff", "operations"),
            ("/admin/tasks", "Tasks", "task.management", "staff", "tasks"),
            ("/admin/approvals", "Approvals", "workflow.approval", "staff", "approvals"),
            ("/admin/documents", "Documents", "documents", "staff", "records"),
            ("/admin/records", "Records", None, "staff", "records"),
        ),
        packs=["task_operations", "approval_operations", "billing_records"],
        optional=["procurement_operations"],
        capabilities=["task.management"],
        primary="/admin/tasks",
        emphasis="tasks",
    ),
}


# Cluster id (harvest) → archetype Starter. No recipe replacement.
CLUSTER_STARTER_IDS: dict[str, str] = {
    "approval_ops": "internal_operations",
    "case_ops": "case_operations",
    "task_ops": "internal_operations",
    "documents_ops": "document_heavy",
    "support_ops": "case_operations",
    "ai_support": "case_operations",
    "crm_sales": "crm_sales",
    "crm_plus_booking": "crm_sales",
    "membership_roster": "membership_association",
    "membership_entitlements": "membership_association",
    "membership_access": "membership_association",
    "board_governance": "document_heavy",
    "billing_records": "internal_operations",
    "catalog_orders_inventory": "catalog_orders",
    "booking_ops": "booking",
    "clinic_admin_not_ehr": "booking",
    "field_service": "service_field",
    "client_portal": "client_portal",
    "application_portal": "application_portal",
    "contract_lifecycle": "document_heavy",
    "workforce": "internal_operations",
    "property_assets": "internal_operations",
    "procurement": "internal_operations",
    "education_cert": "case_operations",
    "education_lms": "internal_operations",
    "clinical_case": "case_operations",
    "certification_operations": "case_operations",
    "procurement_match": "internal_operations",
    "saas_analytics": "internal_operations",
    "construction_estimating": "case_operations",
    "lims_operations": "case_operations",
    "school_operations": "case_operations",
    "social_operations": "internal_operations",
    "warehouse_operations": "internal_operations",
    "transport_operations": "internal_operations",
    "manufacturing_operations": "internal_operations",
    "loan_operations": "internal_operations",
    "aviation_operations": "internal_operations",
    "subscription_operations": "internal_operations",
    "course_delivery": "internal_operations",
    "construction_precon": "case_operations",
    "reporting": "internal_operations",
    "lab_trace": "case_operations",
    "imports_ops": "internal_operations",
}

RECIPE_STARTER_IDS: dict[str, str] = {
    f"mkt_{cluster_id}": starter_id for cluster_id, starter_id in CLUSTER_STARTER_IDS.items()
}
RECIPE_STARTER_IDS["application_portal"] = "application_portal"


def list_archetype_starters() -> list[ArchetypeStarter]:
    return [ARCHETYPE_STARTERS[key] for key in sorted(ARCHETYPE_STARTERS)]


def get_archetype_starter(starter_id: str | None) -> ArchetypeStarter | None:
    if not starter_id:
        return None
    return ARCHETYPE_STARTERS.get(starter_id)


def starter_id_for_cluster(cluster_id: str) -> str | None:
    return CLUSTER_STARTER_IDS.get(cluster_id)


def starter_id_for_recipe(recipe_id: str | None) -> str | None:
    if not recipe_id:
        return None
    return RECIPE_STARTER_IDS.get(recipe_id)


def known_archetype_ids() -> frozenset[str]:
    return frozenset(ARCHETYPE_STARTERS)
