from datetime import datetime
from sqlalchemy import INTEGER, VARCHAR, TIMESTAMP, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship, Session
from app.api.seafarer.schemas import SeafarersCreat
from app.models.main import Base
from pydantic import BaseModel, Field

class SeafarersBase(BaseModel):

    seafarer_id: int | None = Field(default=None)
    role_id : int | None = Field(default=None)
    first_name: str | None = Field(default=None)
    last_name: str | None = Field(default=None)
    middle_name: str | None = Field(default=None)
    email: str | None = Field(default=None)
    mobile: str | None = Field(default=None)
    id_type: int | None = Field(default=None)
    id_number: str | None = Field(default=None)
    id_issue_country: str | None = Field(default=None)
    ship_name: str | None = Field(default=None)
    sf_role_id: int | None = Field(default=None)
    onboard_date: datetime | None = Field(default=None)
    is_captain: str | None = Field(default=None)
    vessel_id: int | None = Field(default=None)
    status: str | None = Field(default=None)

class TblSeafarers(Base):
    __tablename__ = "seafarers"

    seafarer_id: Mapped[int] = mapped_column("seafarer_id",INTEGER, primary_key=True, autoincrement=True)
    role_id: Mapped[int] = mapped_column(INTEGER, ForeignKey("tbl_role.role_id"), nullable=True)
    sf_role_id: Mapped[int] = mapped_column("sf_role_id", INTEGER, ForeignKey("tbl_seafarer_role.sf_role_id"), nullable=True)
    first_name: Mapped[str] = mapped_column("first_name",VARCHAR(255), nullable=True)
    last_name: Mapped[str] = mapped_column("last_name",VARCHAR(255), nullable=True)
    middle_name: Mapped[str] = mapped_column("middle_name",VARCHAR(255), nullable=True)
    email: Mapped[str] = mapped_column("email",VARCHAR(255), nullable=True)
    password : Mapped[str] = mapped_column("password",VARCHAR(20) ,nullable=True)
    mobile: Mapped[str] = mapped_column("mobile",VARCHAR(255), nullable=True)
    id_type: Mapped[int] = mapped_column("id_type",INTEGER, ForeignKey("tbl_seafarer_id_type.id_type"), nullable=True)
    id_number: Mapped[str] = mapped_column("id_number",VARCHAR(255), nullable=True)
    id_issue_country: Mapped[str] = mapped_column("id_issue_country",VARCHAR(255), nullable=True)
    ship_name: Mapped[str] = mapped_column("ship_name",VARCHAR(255), nullable=True)
    onboard_date: Mapped[datetime] = mapped_column("onboard_date",TIMESTAMP, nullable=True)
    is_captain: Mapped[str] = mapped_column("is_captain",VARCHAR(10), nullable=True)
    vessel_id: Mapped[int] = mapped_column(INTEGER, ForeignKey("tbl_vessel_list.vessel_id"), nullable=True)
    status: Mapped[str] = mapped_column("status", VARCHAR(20), nullable=True, server_default="Active")

    role = relationship("TblRole", back_populates="seafarer")
    vessel = relationship("TblVesselList", back_populates="seafarers")
    seafarer_role = relationship("TblSeafarerRole", back_populates="seafarers")
    seafarer_id_type = relationship("TblSeafarerIdType", back_populates="seafarers")
    tikets = relationship("TblTiket", back_populates="seafarer")


    @classmethod
    def create(cls, data: SeafarersCreat, db: Session) -> "TblSeafarers":
        data_dict = data.model_dump()
        new_seafarer = cls(**data_dict)
        db.add(new_seafarer)
        db.flush()
        return new_seafarer