from datetime import date, time
from typing import Optional, Union

from fastapi import UploadFile
from pydantic import BaseModel, ConfigDict, Field,model_validator

from core.config import get_db
from core.security.exceptions import CoreValidationError
from models import Course
from .academic_year import AcademicYearResponseSchema
from .course_category import CourseCategoryResponseSchema
from .term import TermResponseSchema
from .age_group import AgeGroupResponse
from .time_slot import  TimeSlotResponseSchema

class CourseBaseSchema(BaseModel):
    course_category_id: int
    age_group_id: int
    time_slot_id: int
    term_id: Optional[int] = None
    academic_year_id: Optional[int] = None
    name: str
    description: Optional[str] = None
    short_description: Optional[str] = None
    sku: Optional[str] = None
    start_date: Optional[date] = None
    end_date: Optional[date] = None
    start_time: Optional[time] = None
    end_time: Optional[time] = None
    no_of_seats: int
    amount: float
    is_bursary_product: bool
    total_no_terms: int = 0
    no_days_in_term: int = 0
    no_weeks_in_term: int = 0
    is_enable_waitlist: bool = False
    waiting_list_limit: int = 0
    is_special_course:Optional[bool]
    is_active:bool
    rate_per_class: Optional[float] = None
    no_of_classes: Optional[int] = None
    remaining_seat:Optional[int]=0


class CourseCreateSchema(CourseBaseSchema):
    image: UploadFile = Field(default=None)

    @model_validator(mode='after')
    def validate(self):
        with get_db() as db:
            if db.query(Course).where(Course.sku == self.sku,
                                        Course.deleted_at.is_(None)).count() > 0:
                raise CoreValidationError("SKU already exists.")
        return self



class CourseUpdateSchema(CourseBaseSchema):
    image: UploadFile = Field(default=None)


class CourseResponseSchema(CourseBaseSchema):
    id: int
    image: Union[str, None]
    image_url: Union[str, None]
    academic_year:AcademicYearResponseSchema
    term:TermResponseSchema
    course_category:CourseCategoryResponseSchema|dict
    time_slot:TimeSlotResponseSchema
    age_group:AgeGroupResponse
    model_config = ConfigDict(from_attributes=True)

    @model_validator(mode='after')
    def validate(self):
        if self.course_category:
            self.course_category={"id":self.course_category.id,"title":self.course_category.title}
        return self


