from fastapi import HTTPException
from sqlalchemy import INTEGER, VARCHAR
from sqlalchemy.orm import Mapped, mapped_column,Session, relationship
from app.models.main import Base
from pydantic import  Field
from typing import Optional
from app.utils.schemas_utils import CustomModel
class CompanyListBase(CustomModel):

    company_id: Optional[int] = Field(default=None)
    company_name: Optional[str] = Field(default=None)
    licence_valid_until: Optional[str] = Field(default=None)
    client_code: Optional[str] = Field(default=None)
    address: Optional[str] = Field(default=None)
    p_admin_name: Optional[str] = Field(default=None)
    p_admin_email: Optional[str] = Field(default=None)
    p_admin_mobil: Optional[str] = Field(default=None)
    s_admin_name: Optional[str] = Field(default=None)
    s_admin_email: Optional[str] = Field(default=None)
    s_admin_mobil: Optional[str] = Field(default=None)
    licence_date_issued: Optional[str] = Field(default=None)
    certificate_name_format: Optional[str] = Field(default=None)
class TblCompanyList(Base):
    
    __tablename__ = "tbl_company_list"

    company_id: Mapped[int] = mapped_column("company_id", INTEGER, primary_key=True, autoincrement=True)
    company_name: Mapped[str] = mapped_column("company_name", VARCHAR(50), nullable=True)
    licence_valid_until: Mapped[str] = mapped_column("licence_valid_until", VARCHAR(255), nullable=True)
    client_code: Mapped[str] = mapped_column("client_code", VARCHAR(255), nullable=True)
    address: Mapped[str] = mapped_column("address", VARCHAR(255), nullable=True)
    p_admin_name: Mapped[str] = mapped_column("p_admin_name", VARCHAR(255), nullable=True)
    p_admin_email: Mapped[str] = mapped_column("p_admin_email", VARCHAR(255), nullable=True)
    p_admin_mobil: Mapped[str] = mapped_column("p_admin_mobil", VARCHAR(255), nullable=True)
    s_admin_name: Mapped[str] = mapped_column("s_admin_name", VARCHAR(255), nullable=True)
    s_admin_email: Mapped[str] = mapped_column("s_admin_email", VARCHAR(255), nullable=True)
    s_admin_mobil: Mapped[str] = mapped_column("s_admin_mobil", VARCHAR(255), nullable=True)
    licence_date_issued: Mapped[str] = mapped_column(VARCHAR(25),nullable=True)
    certificate_name_format: Mapped[str] = mapped_column("certificate_name_format", VARCHAR(255), nullable=True)

    admins = relationship("TblAdmin", back_populates="company")
    vessels = relationship("TblVesselList", back_populates="company")
    roles = relationship("TblCompanyRoleMap", back_populates="company")
# company_course_roles = relationship("TblCompanyCourseRoleMap", back_populates="company")

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

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

    @classmethod
    def update(cls, company_id: int, data: CompanyListBase, db: Session) -> "TblCompanyList | None":
        get_data = db.query(cls).filter(cls.company_id == company_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