# -*- coding: utf-8 -*-
"""tests.test_dispatch_status_enum_2645 — task-2645 status enum + 천이 규칙."""
from __future__ import annotations

import pytest

from utils.dispatch_status_enum import (
    ALL_STATES,
    DISPATCH_ERROR,
    DISPATCH_PRECHECK_BLOCKED,
    DISPATCH_SILENT_DROP_HOLD,
    DISPATCH_SUBMITTED_UNVERIFIED,
    DISPATCH_VERIFIED_SPAWN,
    FINAL_SUCCESS_STATES,
    HOLD_FOR_CHAIR_STATES,
    NON_FINAL_STATES,
    assert_not_premature_success,
    can_transition,
    is_final_success,
    is_hold_for_chair,
)


def test_state_constants_are_chair_verbatim() -> None:
    assert DISPATCH_SUBMITTED_UNVERIFIED == "DISPATCH_SUBMITTED_UNVERIFIED"
    assert DISPATCH_VERIFIED_SPAWN == "DISPATCH_VERIFIED_SPAWN"
    assert DISPATCH_SILENT_DROP_HOLD == "DISPATCH_SILENT_DROP_HOLD"
    assert DISPATCH_ERROR == "DISPATCH_ERROR"
    assert DISPATCH_PRECHECK_BLOCKED == "DISPATCH_PRECHECK_BLOCKED"


def test_all_states_set_contains_5() -> None:
    assert ALL_STATES == {
        DISPATCH_SUBMITTED_UNVERIFIED,
        DISPATCH_VERIFIED_SPAWN,
        DISPATCH_SILENT_DROP_HOLD,
        DISPATCH_ERROR,
        DISPATCH_PRECHECK_BLOCKED,
    }


def test_final_success_only_verified_spawn() -> None:
    assert FINAL_SUCCESS_STATES == {DISPATCH_VERIFIED_SPAWN}
    assert is_final_success(DISPATCH_VERIFIED_SPAWN) is True
    assert is_final_success(DISPATCH_SUBMITTED_UNVERIFIED) is False


def test_submitted_unverified_blocks_premature_success() -> None:
    """ANCHOR-1: SUBMITTED_UNVERIFIED 로 final success 보고 시도 시 AssertionError."""
    with pytest.raises(AssertionError, match="DISPATCH_SUBMITTED_UNVERIFIED"):
        assert_not_premature_success(DISPATCH_SUBMITTED_UNVERIFIED)
    # 다른 상태는 통과
    assert_not_premature_success(DISPATCH_VERIFIED_SPAWN)
    assert_not_premature_success(DISPATCH_SILENT_DROP_HOLD)


def test_hold_for_chair_only_silent_drop() -> None:
    assert HOLD_FOR_CHAIR_STATES == {DISPATCH_SILENT_DROP_HOLD}
    assert is_hold_for_chair(DISPATCH_SILENT_DROP_HOLD) is True
    assert is_hold_for_chair(DISPATCH_VERIFIED_SPAWN) is False


def test_non_final_states_contains_submitted_unverified() -> None:
    assert DISPATCH_SUBMITTED_UNVERIFIED in NON_FINAL_STATES


def test_transitions_from_submitted_unverified() -> None:
    assert can_transition(DISPATCH_SUBMITTED_UNVERIFIED, DISPATCH_VERIFIED_SPAWN)
    assert can_transition(DISPATCH_SUBMITTED_UNVERIFIED, DISPATCH_SILENT_DROP_HOLD)
    assert can_transition(DISPATCH_SUBMITTED_UNVERIFIED, DISPATCH_ERROR)


def test_terminal_states_have_no_outgoing_transitions() -> None:
    for terminal in (
        DISPATCH_VERIFIED_SPAWN,
        DISPATCH_SILENT_DROP_HOLD,
        DISPATCH_ERROR,
        DISPATCH_PRECHECK_BLOCKED,
    ):
        for nxt in ALL_STATES:
            assert can_transition(terminal, nxt) is False


def test_unknown_state_rejected_in_transitions() -> None:
    assert can_transition("UNKNOWN", DISPATCH_VERIFIED_SPAWN) is False
    assert can_transition(DISPATCH_SUBMITTED_UNVERIFIED, "UNKNOWN") is False
