"""Stable enums for the Publishing Integrity system."""

from enum import Enum


class ValidationState(str, Enum):
    VERIFIED = "VERIFIED"
    VERIFIED_PENDING_LINEUP = "VERIFIED_PENDING_LINEUP"
    SUPPRESSED_TEAM_MISMATCH = "SUPPRESSED_TEAM_MISMATCH"
    SUPPRESSED_UNAVAILABLE = "SUPPRESSED_UNAVAILABLE"
    SUPPRESSED_NOT_IN_STARTING_LINEUP = "SUPPRESSED_NOT_IN_STARTING_LINEUP"
    SUPPRESSED_NO_MARKET_CONFIRMATION = "SUPPRESSED_NO_MARKET_CONFIRMATION"
    SUPPRESSED_IDENTITY_COLLISION = "SUPPRESSED_IDENTITY_COLLISION"
    SUPPRESSED_STALE_DATA = "SUPPRESSED_STALE_DATA"
    SUPPRESSED_NO_CANONICAL_ID = "SUPPRESSED_NO_CANONICAL_ID"
    MANUAL_REVIEW_REQUIRED = "MANUAL_REVIEW_REQUIRED"

    @property
    def is_suppressed(self) -> bool:
        return self.value.startswith("SUPPRESSED_")

    @property
    def is_publishable(self) -> bool:
        return self in (ValidationState.VERIFIED, ValidationState.VERIFIED_PENDING_LINEUP)


class AvailabilityStatus(str, Enum):
    AVAILABLE = "AVAILABLE"
    PROBABLE = "PROBABLE"
    QUESTIONABLE = "QUESTIONABLE"
    DOUBTFUL = "DOUBTFUL"
    OUT = "OUT"
    INACTIVE = "INACTIVE"
    SUSPENDED = "SUSPENDED"
    SCRATCHED = "SCRATCHED"
    UNKNOWN = "UNKNOWN"

    @property
    def is_blocking(self) -> bool:
        return self in (
            AvailabilityStatus.OUT,
            AvailabilityStatus.INACTIVE,
            AvailabilityStatus.SUSPENDED,
            AvailabilityStatus.SCRATCHED,
        )


class LineupStatus(str, Enum):
    CONFIRMED_STARTER = "CONFIRMED_STARTER"
    PROJECTED_STARTER = "PROJECTED_STARTER"
    BENCH = "BENCH"
    CONFIRMED_OUT_OF_LINEUP = "CONFIRMED_OUT_OF_LINEUP"
    STARTING_GOALIE = "STARTING_GOALIE"
    PROJECTED_GOALIE = "PROJECTED_GOALIE"
    STARTING_XI = "STARTING_XI"
    UNKNOWN = "UNKNOWN"

    @property
    def is_confirmed_starter(self) -> bool:
        return self in (
            LineupStatus.CONFIRMED_STARTER,
            LineupStatus.STARTING_GOALIE,
            LineupStatus.STARTING_XI,
        )


class AuditAction(str, Enum):
    PUBLISHED = "PUBLISHED"
    SUPPRESSED = "SUPPRESSED"
    UNPUBLISHED = "UNPUBLISHED"
    FLAGGED_FOR_REVIEW = "FLAGGED_FOR_REVIEW"
    REPROCESSED = "REPROCESSED"


class RunType(str, Enum):
    MORNING_FULL = "morning_full"
    MIDDAY_CONFIRM = "midday_confirm"
    PRE_GAME_FINAL = "pre_game_final"
    MANUAL = "manual"


class SourceTier(str, Enum):
    OFFICIAL = "official"       # Tier 1
    MARKET = "market"           # Tier 2
    INTERNAL = "internal"       # Tier 3
