from fastapi import HTTPException
from sqlalchemy import INTEGER,VARCHAR, Enum, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, Session, relationship
from app.models.main import Base
from pydantic import Field
from app.utils.common_utils import CdiElementEnum, FunctionalAreaEnum, OperationalAreaEnum, RightshipDbmsEnum, SeriesEnum, SireElementEnum, StcwElementEnum, TargetAudienceEnum, TmsaElementEnum
from app.utils.schemas_utils import CustomModel
class CourseListBase(CustomModel):

    course_id: int | None = Field(default=None)
    course_name: str | None = Field(default=None)
    duration_hrs: int | None = Field(default=None)
    operational_area: str | None = Field(default=None)  
    functional_area: str | None = Field(default=None)
    target_audience: str | None = Field(default=None)
    standards: str | None = Field(default=None)
    validity_days: int | None = Field(default=None)
    minimum_hours: int | None = Field(default=None)
    pass_percentage: int | None = Field(default=None)
    maximum_mark: int | None = Field(default=None)
    pass_mark: int | None = Field(default=None)
    series: str | None = Field(default=None)
    sire_elements: str | None = Field(default=None)
    rightship_dbms_elements: str | None = Field(default=None)
    tmsa_elements: str | None = Field(default=None)
    cdi_elements: str | None = Field(default=None)
    stcw_elements: str | None = Field(default=None)  
    approved_by_classnk: str | None = Field(default=None)
    course_overview: str | None = Field(default=None) 
    full_course_id: int | None = Field(default=None)

class TblCourseList(Base):
    __tablename__ = "course_list"

    course_id: Mapped[int] = mapped_column("course_id", INTEGER, primary_key=True, autoincrement=True)
    course_name: Mapped[str] = mapped_column("course_name", VARCHAR(255), nullable=False)
    duration_hrs: Mapped[int] = mapped_column("duration_hrs", INTEGER, nullable=True)
    operational_area: Mapped[OperationalAreaEnum] = mapped_column(Enum(OperationalAreaEnum), nullable=True)
    functional_area: Mapped[FunctionalAreaEnum] = mapped_column(Enum(FunctionalAreaEnum), nullable=True)
    target_audience: Mapped[TargetAudienceEnum] = mapped_column(Enum(TargetAudienceEnum), nullable=True)
    standards: Mapped[str] = mapped_column("standards", VARCHAR(50), nullable=True)
    validity_days: Mapped[int] = mapped_column("validity_days", INTEGER, nullable=True)
    full_course_id: Mapped[int] = mapped_column(INTEGER, ForeignKey("tbl_full_courses.full_course_id"), nullable=True)
    minimum_hours: Mapped[int] = mapped_column("minimum_hours", INTEGER, nullable=True, default=None)
    pass_percentage: Mapped[int] = mapped_column("pass_percentage", INTEGER, nullable=True, default=None)
    maximum_mark: Mapped[int] = mapped_column("maximum_mark", INTEGER, nullable=True, default=None)
    pass_mark: Mapped[int] = mapped_column("pass_mark", INTEGER, nullable=True, default=None)
    series: Mapped[SeriesEnum] = mapped_column(Enum(SeriesEnum), nullable=True, default=None)
    sire_elements: Mapped[SireElementEnum] = mapped_column(Enum(SireElementEnum), nullable=True, default=None)
    rightship_dbms_elements: Mapped[RightshipDbmsEnum] = mapped_column(Enum(RightshipDbmsEnum), nullable=True, default=None)
    tmsa_elements: Mapped[TmsaElementEnum] = mapped_column(Enum(TmsaElementEnum), nullable=True, default=None)
    cdi_elements: Mapped[CdiElementEnum] = mapped_column(Enum(CdiElementEnum), nullable=True, default=None)
    stcw_elements: Mapped[StcwElementEnum] = mapped_column(Enum(StcwElementEnum), nullable=True, default=None)
    approved_by_classnk: Mapped[str] = mapped_column("approved_by_classnk", VARCHAR(20), nullable=True, default=None)
    course_overview: Mapped[str] = mapped_column("course_overview", VARCHAR(255), nullable=True, default=None)

    full_course = relationship("TblFullCourse", back_populates="courses")
    company_course_roles = relationship("TblCompanyCourseRoleMap", back_populates="course")
    

    @classmethod
    def create(cls, data: CourseListBase, db: Session) -> "TblCourseList":
        data_dict = data.model_dump()
        new_course = cls(**data_dict)
        db.add(new_course)
        db.flush()
        return new_course

    @classmethod
    def get_by_id(cls, course_id: int, db: Session) -> CourseListBase:
        result = db.query(cls).filter(cls.course_id == course_id).first()
        if not result:
            raise HTTPException(status_code=404, detail="Course not found")
        return CourseListBase.model_validate(result)

    # @classmethod
    # def update(cls, course_id: int, data: CourseListBase, db: Session) -> "TblCourseList | None":
    #     get_data = db.query(cls).filter(cls.course_id == course_id).first()
    #     if not get_data:
    #         return None
    #     data_dict = data.model_dump()
    #     for key, value in data_dict.items():
    #         if value is not None:
    #             setattr(get_data, key, value)
    #     db.commit()
    #     db.refresh(get_data)
    #     return get_data

    @classmethod
    def update(cls, course_id: int, data: CourseListBase, db: Session) -> "TblCourseList | None":
        get_data = db.query(cls).filter(cls.course_id == course_id).first()
        if not get_data:
            return None  
        data_dict = data.model_dump()
        for key, value in data_dict.items():
            if value is not None:
                setattr(get_data, key, value)
        db.commit()
        db.refresh(get_data)
        return get_data
    

# class TblCourseList(Base):
#     __tablename__ = "course_list"

#     course_id: Mapped[int] = mapped_column("course_id", INTEGER, primary_key=True, autoincrement=True)
#     course_name: Mapped[str] = mapped_column("course_name", VARCHAR(255), nullable=False)
#     duration_hrs: Mapped[int] = mapped_column("duration_hrs", INTEGER, nullable=True)
#     operational_area: Mapped[str] = mapped_column("operational_area", VARCHAR(50), nullable=True)
#     functional_area: Mapped[str] = mapped_column("functional_area", VARCHAR(50), nullable=True)
#     target_audience: Mapped[str] = mapped_column("target_audience", VARCHAR(50), nullable=True)
#     standards: Mapped[str] = mapped_column("standards", VARCHAR(50), nullable=True)
#     validity_days: Mapped[int] = mapped_column("validity_days", INTEGER, nullable=True)
#     full_course_id: Mapped[int] = mapped_column(INTEGER, ForeignKey("tbl_full_courses.full_course_id"), nullable=True)
#     minimum_hours: Mapped[int] = mapped_column("minimum_hours", INTEGER, nullable=True, default=None)
#     pass_percentage: Mapped[int] = mapped_column("pass_percentage", INTEGER, nullable=True, default=None)
#     maximum_mark: Mapped[int] = mapped_column("maximum_mark", INTEGER, nullable=True, default=None)
#     pass_mark: Mapped[int] = mapped_column("pass_mark", INTEGER, nullable=True, default=None)
#     series: Mapped[str] = mapped_column("series", VARCHAR(50), nullable=True, default=None)
#     sire_elements: Mapped[str] = mapped_column("sire_elements", VARCHAR(50), nullable=True, default=None)
#     rightship_dbms_elements: Mapped[str] = mapped_column("rightship_dbms_elements", VARCHAR(50), nullable=True, default=None)
#     tmsa_elements: Mapped[str] = mapped_column("tmsa_elements", VARCHAR(50), nullable=True, default=None)
#     cdi_elements: Mapped[str] = mapped_column("cdi_elements", VARCHAR(50), nullable=True, default=None)
#     stcw_elements: Mapped[str] = mapped_column("stcw_elements", VARCHAR(50), nullable=True, default=None)
#     approved_by_classnk: Mapped[str] = mapped_column("approved_by_classnk", VARCHAR(15), nullable=True, default=None)
#     course_overview: Mapped[str] = mapped_column("course_overview", VARCHAR(255), nullable=True, default=None)

#     full_course = relationship("TblFullCourse", back_populates="courses")    
