"""SME-Hub onboarding & vetting state machines (Phase 6.1).

The actual ``@transition`` decorators live on the model classes (matches the
project convention used by ``EntrepreneurProfile`` / ``Business`` / role
profiles in :mod:`apps.smehub.onboarding.models` — see also
``apps.rims.grants`` and ``apps.smehub.marketplace.models.BuyerRegistryEntry``).

This module is the single source of truth for **describing** those state
machines: it re-exports the lifecycle enum, names every legal transition, and
flags terminal states so views, templates, and admin filters can render the
graph without duplicating the choices.
"""
from __future__ import annotations

from apps.smehub.onboarding.models import Innovation

InnovationStatus = Innovation.Status

INNOVATION_TERMINAL_STATES: frozenset[str] = frozenset(
    {InnovationStatus.APPROVED, InnovationStatus.REJECTED, InnovationStatus.WITHDRAWN}
)

INNOVATION_TRANSITIONS: dict[str, list[str]] = {
    InnovationStatus.DRAFT: [InnovationStatus.SUBMITTED, InnovationStatus.WITHDRAWN],
    InnovationStatus.SUBMITTED: [
        InnovationStatus.UNDER_VETTING,
        InnovationStatus.REVISIONS_REQUESTED,
        InnovationStatus.REJECTED,
        InnovationStatus.WITHDRAWN,
    ],
    InnovationStatus.UNDER_VETTING: [
        InnovationStatus.APPROVED,
        InnovationStatus.REJECTED,
        InnovationStatus.REVISIONS_REQUESTED,
        InnovationStatus.WITHDRAWN,
    ],
    InnovationStatus.REVISIONS_REQUESTED: [
        InnovationStatus.SUBMITTED,
        InnovationStatus.WITHDRAWN,
    ],
    InnovationStatus.APPROVED: [],
    InnovationStatus.REJECTED: [],
    InnovationStatus.WITHDRAWN: [],
}

INNOVATION_TRANSITION_LABELS: dict[tuple[str, str], str] = {
    (InnovationStatus.DRAFT, InnovationStatus.SUBMITTED): "Submit for vetting",
    (InnovationStatus.REVISIONS_REQUESTED, InnovationStatus.SUBMITTED): "Resubmit",
    (InnovationStatus.SUBMITTED, InnovationStatus.UNDER_VETTING): "Start vetting",
    (InnovationStatus.UNDER_VETTING, InnovationStatus.APPROVED): "Approve",
    (InnovationStatus.UNDER_VETTING, InnovationStatus.REJECTED): "Reject",
    (InnovationStatus.UNDER_VETTING, InnovationStatus.REVISIONS_REQUESTED): "Request revisions",
    (InnovationStatus.SUBMITTED, InnovationStatus.REVISIONS_REQUESTED): "Request revisions",
    (InnovationStatus.SUBMITTED, InnovationStatus.REJECTED): "Reject before vetting",
}


def is_terminal(status: str) -> bool:
    return status in INNOVATION_TERMINAL_STATES


def can_transition(from_status: str, to_status: str) -> bool:
    return to_status in INNOVATION_TRANSITIONS.get(from_status, [])
