from datetime import date, datetime

from .exceptions import (
    InvalidSeasonDatesError,
    InvalidSeasonNameError,
    InvalidSeasonYearError,
)


def validate_season_dates(*, start_date: date, end_date: date) -> None:
    if (
        not isinstance(start_date, date)
        or isinstance(start_date, datetime)
        or not isinstance(end_date, date)
        or isinstance(end_date, datetime)
    ):
        raise InvalidSeasonDatesError(
            "Season start_date and end_date must be date values."
        )

    if start_date >= end_date:
        raise InvalidSeasonDatesError(
            "Season start_date must be before end_date."
        )


def validate_season_name(name: str) -> str:
    if not isinstance(name, str):
        raise InvalidSeasonNameError(
            "Season name must be a string."
        )

    name = name.strip()

    if not name:
        raise InvalidSeasonNameError(
            "Season name cannot be empty."
        )

    if len(name) > 100:
        raise InvalidSeasonNameError(
            "Season name cannot exceed 100 characters."
        )

    return name


def validate_season_year(year: int) -> int:
    # bool is a subclass of int, but is never a valid domain year.
    if isinstance(year, bool) or not isinstance(year, int):
        raise InvalidSeasonYearError(
            "Season year must be an integer."
        )

    if year < 1900 or year > 2200:
        raise InvalidSeasonYearError(
            "Season year must be between 1900 and 2200."
        )

    return year
