from typing import List, Optional

from pydantic import BaseModel, ConfigDict, model_validator

from core.config import get_db
from models import Role
from schema import GenericResponse


class RoleCreateSchema(BaseModel):
    label: str
    has_attendance_management: bool = False

    @model_validator(mode="after")
    def validate(self):
        with get_db() as db:
            if db.query(Role).filter(Role.label == self.label,Role.deleted_at.is_(None)).count() > 0:
                raise ValueError("Role already exists")
        return self


class RoleInstanceSchema(BaseModel):
    id: int
    label: str
    has_attendance_management: Optional[bool] = False
    model_config = ConfigDict(from_attributes=True)

    @model_validator(mode="after")
    def validate(self):
        if self.has_attendance_management is None:
            self.has_attendance_management = False
        return self


class RoleListResponseSchema(GenericResponse):
    data: List[RoleInstanceSchema]


class RoleResponseSchema(GenericResponse):
    data: RoleInstanceSchema


class RoleUpdateRequest(BaseModel):
    id: int
    label: str
    has_attendance_management: bool = False

    @model_validator(mode="after")
    def validate(self):
        with get_db() as db:
            if db.query(Role).filter(Role.label == self.label, Role.id != self.id,Role.deleted_at.is_(None)).count() > 0:
                raise ValueError("Role already exists")
        return self
