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


class EnrolledSeafarerInfoBase(CustomModel):
    es_id: int | None = Field(default=None)
    enrollment_id: int | None = Field(default=None)
    enroll_date: datetime | None = Field(default=None)
    course_name: str | None = Field(default=None)
    last_accessed: str | None = Field(default=None)
    pass_score: float | None = Field(default=None)
    Accessed_hrs: float | None = Field(default=None)
    e_Learning: str | None = Field(default=None)
    clr: str | None = Field(default=None)
    certificate: str | 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)
    certificate_comments: str | None = Field(default=None)
    prioritize: str | None = Field(default=None)
    drop_seafarer_course: str | None = Field(default=None)

class TblEnrolledSeafarerInfo(Base):
    __tablename__ = "enrolled_seafarer_info"
    
    es_id:Mapped[int] = mapped_column("es_id", INTEGER, primary_key=True, autoincrement=True)
    enrollment_id:Mapped[int] = mapped_column( INTEGER,ForeignKey("enrollment.enrollment_id"), nullable=True)
    enroll_date:Mapped[datetime] = mapped_column("enroll_date", TIMESTAMP, nullable=True)
    course_name:Mapped[str] = mapped_column("course_name", VARCHAR(255), nullable=True)
    last_accessed:Mapped[str] = mapped_column("last_accessed", VARCHAR(255), nullable=True)
    pass_score:Mapped[float] = mapped_column("pass_score", FLOAT, nullable=True)
    Accessed_hrs:Mapped[float] = mapped_column("Accessed_hrs", FLOAT, nullable=True)
    e_Learning:Mapped[str] = mapped_column("e_Learning", VARCHAR(255), nullable=True)
    clr:Mapped[str] = mapped_column("clr", VARCHAR(255), nullable=True)
    certificate:Mapped[str] = mapped_column("certificate", VARCHAR(255), nullable=True)
    operational_area:Mapped[str] = mapped_column("operational_area", VARCHAR(255), nullable=True)
    functional_area:Mapped[str] = mapped_column("functional_area", VARCHAR(255), nullable=True)
    target_audience:Mapped[str] = mapped_column("target_audience", VARCHAR(255), nullable=True)
    certificate_comments:Mapped[str] = mapped_column("certificate_comments", VARCHAR(255), nullable=True)
    prioritize:Mapped[str] = mapped_column("prioritize", VARCHAR(255), nullable=True)
    drop_seafarer_course:Mapped[str] = mapped_column("drop_seafarer_course", VARCHAR(255), nullable=True)

    enrolled_seafarer_info = relationship("TblEnrollment", back_populates="enrollment")

    @classmethod
    def create(cls,db : Session,data : EnrolledSeafarerInfoBase ) -> "TblEnrolledSeafarerInfo":
        new_enrolled_seafarer_info = cls(**data.model_dump())
        db.add(new_enrolled_seafarer_info)
        db.flush()
        db.commit()
        return new_enrolled_seafarer_info


