from .constants import SeasonStatus
from .exceptions import SeasonNotFoundError
from .models import Season


def get_season(*, season_id):
    try:
        return Season.objects.get(pk=season_id)
    except Season.DoesNotExist as exc:
        raise SeasonNotFoundError(
            "Season does not exist."
        ) from exc


def get_active_season():
    return (
        Season.objects
        .filter(status=SeasonStatus.ACTIVE)
        .first()
    )


def get_upcoming_seasons():
    return (
        Season.objects
        .filter(status=SeasonStatus.UPCOMING)
        .order_by("start_date", "id")
    )


def get_completed_seasons():
    return (
        Season.objects
        .filter(status=SeasonStatus.COMPLETED)
        .order_by("-end_date", "-id")
    )


def get_archived_seasons():
    return (
        Season.objects
        .filter(status=SeasonStatus.ARCHIVED)
        .order_by("-end_date", "-id")
    )


def get_cancelled_seasons():
    return (
        Season.objects
        .filter(status=SeasonStatus.CANCELLED)
        .order_by("-start_date", "-id")
    )


def get_season_by_year(*, year):
    return Season.objects.filter(year=year).first()

def get_orchestration_run(*, run_id):
    from .models import SeasonOrchestrationRun

    return (
        SeasonOrchestrationRun.objects
        .select_related("source_season", "target_season")
        .filter(pk=run_id)
        .first()
    )


def get_orchestration_for_pair(*, source_season_id, target_season_id):
    from .models import SeasonOrchestrationRun

    return (
        SeasonOrchestrationRun.objects
        .select_related("source_season", "target_season")
        .filter(source_season_id=source_season_id, target_season_id=target_season_id)
        .first()
    )


def get_orchestration_steps(*, run_id):
    from .models import SeasonOrchestrationStep

    return SeasonOrchestrationStep.objects.filter(run_id=run_id).order_by("ordinal")


def get_season_calendar(*, season_id):
    from .models import SeasonCompetitionCalendarSlot

    return (
        SeasonCompetitionCalendarSlot.objects
        .filter(season_id=season_id)
        .select_related("league_competition", "federation_competition")
        .order_by("scheduled_date", "source_type", "sequence", "id")
    )
