from typing import Optional, Union

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

from core.config import get_db
from core.security.exceptions import CoreValidationError
from models.course_category import CourseCategory


class CourseCategoryBaseSchema(BaseModel):
    title: str
    description: Optional[str] = None


class CourseCategoryCreate(CourseCategoryBaseSchema):
    icon: UploadFile = Field(default=None)

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


class CourseCategoryUpdateSchema(CourseCategoryBaseSchema):
    id: int
    icon: UploadFile = Field(default=None)

    @model_validator(mode='after')
    def validate_fields(self):
        with get_db() as db:
            if db.query(CourseCategory).where(CourseCategory.title == self.title, CourseCategory.deleted_at.is_(None),
                                              CourseCategory.id != self.id).count() > 0:
                raise CoreValidationError("Course category already exists.")
        return self


class CourseCategoryResponseSchema(CourseCategoryBaseSchema):
    id: int
    icon_url: Union[None, str]
    icon: Union[str, None]
    model_config = ConfigDict(from_attributes=True)
