from dataclasses import dataclass
from typing import Optional

from transfers.eligibility.constants import (
    EligibilityCode,
    EligibilityStatus,
)


@dataclass(frozen=True)
class EligibilityReason:
    code: EligibilityCode
    status: EligibilityStatus
    message: str


@dataclass(frozen=True)
class EligibilityResult:
    status: EligibilityStatus
    reasons: tuple[EligibilityReason, ...]

    @property
    def is_allowed(self) -> bool:
        return self.status == EligibilityStatus.ALLOWED

    @property
    def is_denied(self) -> bool:
        return self.status == EligibilityStatus.DENIED

    @property
    def requires_approval(self) -> bool:
        return self.status == EligibilityStatus.REQUIRES_APPROVAL

    @property
    def primary_reason(self) -> Optional[EligibilityReason]:
        return self.reasons[0] if self.reasons else None