"""Canonical application FSM enum used across SP2/SP4/SP5.

The state set is the union of every status SP2 ``Application``, SP4
``ShowcaseApplication``, and SP5 ``FundingApplication`` need today plus the
``NOT_SUBMITTED`` sink state Phase 3 introduces for the expired-draft
sweeper (FRSME-INC014 alt-flow A2).

This is a free-standing TextChoices — *not* a model field — so SPs can wire
it up against their existing FSM machinery without a schema migration.
SP4's missing DRAFT state (audit finding) is the natural reason for SP4 to
adopt this enum first.
"""
from __future__ import annotations

from django.db import models


class ApplicationStatus(models.TextChoices):
    DRAFT = "draft", "Draft (auto-saved)"
    SUBMITTED = "submitted", "Submitted"
    UNDER_REVIEW = "under_review", "Under review"
    RETURNED_FOR_INFO = "returned_for_info", "Returned for more info"
    ACCEPTED = "accepted", "Accepted"
    REJECTED = "rejected", "Not selected"
    WITHDRAWN = "withdrawn", "Withdrawn"
    NOT_SUBMITTED = "not_submitted", "Draft expired before submission"


# Status sets used by the shared helpers and by per-SP queries.

ACTIVE_REVIEW_STATES: frozenset[str] = frozenset({
    ApplicationStatus.SUBMITTED.value,
    ApplicationStatus.UNDER_REVIEW.value,
})

DECIDED_STATES: frozenset[str] = frozenset({
    ApplicationStatus.ACCEPTED.value,
    ApplicationStatus.REJECTED.value,
})

DEAD_STATES: frozenset[str] = frozenset({
    ApplicationStatus.WITHDRAWN.value,
    ApplicationStatus.NOT_SUBMITTED.value,
})
