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

from fastapi import APIRouter, Query, status

from repositories.user_repository import UserRepository
from repositories.special_holiday_repository import SpecialHolidayRepository
from schemas.holiday import CreateHolidayRequest, SpecialHolidayResponseSchema
from utils.auth_dependency import handles_authentication, user_dependency
from utils.database import db_dependency
from utils.exceptions import NotFoundException, AuthenticationError
from utils.response import Response, ObjectResponseModel, ListResponseModel, BaseResponseModel, ErrorResponseModel

router = APIRouter(prefix="/api/holidays", tags=["Special Holidays"])


@router.post("/create", status_code=status.HTTP_201_CREATED, response_model=ObjectResponseModel)
@handles_authentication
async def create_holiday(user: user_dependency, request: CreateHolidayRequest, db: db_dependency):
    user_repo = UserRepository(db)
    holiday_repo = SpecialHolidayRepository(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")

    # Check if holiday already exists for this date
    existing = await holiday_repo.get_by_company_and_date(user.default_company, request.date)
    if existing:
        return Response.post(message="A holiday already exists for this date.")

    created_holiday = await holiday_repo.create_holiday(
        company_id=user.default_company,
        holiday_date=request.date,
        name=request.name
    )

    ret_holiday = {
        'id': created_holiday.id,
        'date': created_holiday.date,
        'name': created_holiday.name,
    }
    return Response.post(ret_holiday, "Holiday")


@router.get("/read_all", status_code=status.HTTP_200_OK, response_model=ListResponseModel)
@handles_authentication
async def get_holidays(
    user: user_dependency,
    db: db_dependency,
    start: int = Query(0, ge=0),
    limit: int = Query(10, ge=1, le=100)
):
    user_repo = UserRepository(db)
    holiday_repo = SpecialHolidayRepository(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")

    result = await holiday_repo.get_by_company(user.default_company, start, limit)
    return Response.get_list(
        name="Holidays",
        collection=result["data"],
        page_size=limit,
        total=result["total_count"]
    )


@router.delete("/{holiday_id}", status_code=status.HTTP_200_OK, response_model=BaseResponseModel)
async def delete_holiday(
    holiday_id: int,
    user: user_dependency,
    db: db_dependency
):
    if user is None:
        raise AuthenticationError

    user_repo = UserRepository(db)
    holiday_repo = SpecialHolidayRepository(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")

    deleted_holiday = await holiday_repo.delete_holiday(holiday_id=holiday_id, company_id=user.default_company)
    if not deleted_holiday:
        raise NotFoundException("Holiday")

    return Response.delete(name="Holiday")



