"""Admin work-schedule (standard check-in/check-out) use cases.

These define the standard times used to compute lateness/overtime in the
monthly report: a global default, optionally overridden for a single date.
"""
from __future__ import annotations

import datetime

from domain.exceptions import InvalidLeaveRequestError
from domain.repositories import WorkScheduleRepository


def _validate_times(standard_check_in: datetime.time, standard_check_out: datetime.time) -> None:
    if standard_check_out <= standard_check_in:
        raise InvalidLeaveRequestError("standard_check_out must be after standard_check_in.")


class SetDefaultWorkSchedule:
    def __init__(self, repo: WorkScheduleRepository):
        self.repo = repo

    def execute(self, standard_check_in: datetime.time, standard_check_out: datetime.time):
        _validate_times(standard_check_in, standard_check_out)
        return self.repo.set_default(standard_check_in, standard_check_out)


class SetWorkScheduleForDate:
    def __init__(self, repo: WorkScheduleRepository):
        self.repo = repo

    def execute(
        self, date: datetime.date, standard_check_in: datetime.time, standard_check_out: datetime.time
    ):
        _validate_times(standard_check_in, standard_check_out)
        return self.repo.set_for_date(date, standard_check_in, standard_check_out)


class DeleteWorkScheduleForDate:
    def __init__(self, repo: WorkScheduleRepository):
        self.repo = repo

    def execute(self, date: datetime.date) -> None:
        self.repo.delete_for_date(date)
