from sqlalchemy import Enum, ForeignKey, Integer, Float, VARCHAR, TIMESTAMP, text
from sqlalchemy.orm import Mapped, mapped_column, relationship, Session
from datetime import datetime
from app.models.base_class import Base
from pydantic import BaseModel, Field

class TiketBase(BaseModel):

    tiket_id: int | None = Field(default=None)
    tiket_date: str | None = Field(default=None)
    seafarer_info: str | None = Field(default=None)
    seafarer_id: int | None = Field(default=None)
    id_info: str | None = Field(default=None)
    area: float | None = Field(default=None)
    tiket_no: int | None = Field(default=None)
    answered_date: datetime | None = Field(default=None)
    hh_mm: str | None = Field(default=None)
    sla_met: str | None = Field(default=None)
    created_at: datetime | None = Field(default=None)
    updated_at: datetime | None = Field(default=None)


class TblTiket(Base):
    __tablename__ = "tbl_tiket"

    tiket_id: Mapped[int] = mapped_column("tiket_id",Integer, primary_key=True, autoincrement=True)
    tiket_date: Mapped[str] = mapped_column("tiket_date",VARCHAR(255), nullable=True, server_default=None)
    seafarer_info: Mapped[str] = mapped_column("seafarer_info", VARCHAR(255), nullable=True, server_default=None)
    seafarer_id: Mapped[int] = mapped_column("seafarer_id", Integer, ForeignKey("seafarers.seafarer_id"), nullable=True)
    id_info: Mapped[str] = mapped_column("id_info",VARCHAR(255), nullable=True, server_default=None)
    area: Mapped[float] = mapped_column("area",Float, nullable=True, server_default=None)
    tiket_no: Mapped[int] = mapped_column("tiket_no",Integer, nullable=True, server_default=None)
    answered_date: Mapped[datetime] = mapped_column("answered_date",TIMESTAMP, nullable=True, server_default=None)
    hh_mm: Mapped[str] = mapped_column("hh_mm",VARCHAR(10), nullable=True, server_default=None)
    sla_met: Mapped[str] = mapped_column("sla_met",Enum("Yes", "No", name="sla_met"),nullable=True,server_default=None)
    created_at: Mapped[str] = mapped_column("created_At", TIMESTAMP, nullable=False, server_default=text("current_timestamp()"))
    updated_at: Mapped[str] = mapped_column("updated_at", TIMESTAMP, nullable=True, server_default=text("NULL ON UPDATE current_timestamp()"))

    seafarer = relationship("TblSeafarers", back_populates="tikets")

    @classmethod
    def create(cls, data: TiketBase, db: Session) -> "TblTiket":
        data_dict = data.model_dump()
        new_admin = cls(**data_dict)
        db.add(new_admin)
        db.flush()
        return new_admin