"""Coach & Staff validators — Phase 9.3."""
from __future__ import annotations

from datetime import datetime, time

from app.models.types import AssignmentKind, StaffKind
from shared.exceptions import AppError


def validate_staff_kind(value: str | StaffKind) -> StaffKind:
    if isinstance(value, StaffKind):
        return value
    try:
        return StaffKind(value)
    except ValueError as exc:
        raise AppError("نوع پرسنل نامعتبر است", error_code="invalid_staff_kind") from exc


def validate_assignment_kind(value: str | AssignmentKind) -> AssignmentKind:
    if isinstance(value, AssignmentKind):
        return value
    try:
        return AssignmentKind(value)
    except ValueError as exc:
        raise AppError("نوع تخصیص نامعتبر است", error_code="invalid_assignment_kind") from exc


def validate_day_of_week(value: int) -> int:
    if value < 0 or value > 6:
        raise AppError("روز هفته باید بین ۰ تا ۶ باشد", error_code="invalid_day_of_week")
    return value


def validate_time_window(starts_at: time, ends_at: time) -> None:
    if starts_at >= ends_at:
        raise AppError("ساعت پایان باید بعد از شروع باشد", error_code="invalid_time_window")


def validate_datetime_window(starts_at: datetime, ends_at: datetime) -> None:
    if starts_at >= ends_at:
        raise AppError("زمان پایان باید بعد از شروع باشد", error_code="invalid_datetime_window")
