from datetime import datetime, timezone
from typing import Optional, List

from fastapi import APIRouter, Query, status

from repositories.service_repository import ServiceRepository
from repositories.user_repository import UserRepository
from repositories.weekly_schedule_repository import WeeklyScheduleRepository
from schemas.service import ServiceSchema, CreateServiceRequest, UpdateServiceRequest
from schemas.schedule import CreateScheduleRequest, ScheduleResponseSchema
from utils.auth_dependency import handles_authentication, user_dependency
from utils.database import db_dependency
from utils.exceptions import NotFoundException
from utils.response import Response, ObjectResponseModel, ListResponseModel, BaseResponseModel

router = APIRouter(prefix="/api/schedules", tags=["Schedules"])


@router.post("/create", status_code=status.HTTP_201_CREATED, response_model=ObjectResponseModel)
@handles_authentication
async def create_schedule(user: user_dependency, request: CreateScheduleRequest, db: db_dependency):
    user_repo = UserRepository(db)
    schedule_repo = WeeklyScheduleRepository(db)

    user = await user_repo.get_by_email(user.get('email'), convert_to_entity=False)
    if not user or not user.default_company:
        raise NotFoundException("Company")

    created_schedules = await schedule_repo.create_schedules(user.default_company, request.schedules)

    if not created_schedules:
        return Response.post(message="No new schedules were created. Some schedules might already exist for these days.")

    return Response.post(created_schedules, "Schedules")


@router.get("/read_all", status_code=status.HTTP_200_OK, response_model=ObjectResponseModel)
@handles_authentication
async def get_schedules(user: user_dependency, db: db_dependency):
    user_repo = UserRepository(db)
    schedule_repo = WeeklyScheduleRepository(db)

    user = await user_repo.get_by_email(user.get('email'), convert_to_entity=False)
    if not user or not user.default_company:
        raise NotFoundException("Company")

    schedules = await schedule_repo.get_by_company(user.default_company)
    return Response.get(schedules, "Schedules")

