"""Order Lifecycle State Machine and Transition Guardrails."""
from __future__ import annotations

from typing import Set

from backend.app.schemas.order import OrderStatus

VALID_TRANSITIONS: dict[OrderStatus, Set[OrderStatus]] = {
    OrderStatus.REQUESTED: {OrderStatus.SUBMITTED, OrderStatus.REJECTED},
    OrderStatus.SUBMITTED: {OrderStatus.ACCEPTED, OrderStatus.REJECTED, OrderStatus.UNKNOWN, OrderStatus.FILLED},
    OrderStatus.ACCEPTED: {OrderStatus.PARTIALLY_FILLED, OrderStatus.FILLED, OrderStatus.CANCELLED, OrderStatus.UNKNOWN},
    OrderStatus.PARTIALLY_FILLED: {OrderStatus.FILLED, OrderStatus.CANCELLED, OrderStatus.UNKNOWN},
    OrderStatus.UNKNOWN: {OrderStatus.RECONCILING, OrderStatus.CANCELLED},
    OrderStatus.RECONCILING: {OrderStatus.ACCEPTED, OrderStatus.PARTIALLY_FILLED, OrderStatus.FILLED, OrderStatus.CANCELLED, OrderStatus.REJECTED},
    OrderStatus.FILLED: set(),      # Terminal
    OrderStatus.CANCELLED: set(),   # Terminal
    OrderStatus.REJECTED: set(),    # Terminal
}


class OrderStateMachine:
    """Guarantees valid transitions across the order lifecycle and rejects illegal states."""

    @staticmethod
    def validate_transition(current: OrderStatus, target: OrderStatus) -> bool:
        allowed = VALID_TRANSITIONS.get(current, set())
        return target in allowed

    @staticmethod
    def is_terminal(status: OrderStatus) -> bool:
        return status in {OrderStatus.FILLED, OrderStatus.CANCELLED, OrderStatus.REJECTED}
