from pydantic import Field
from sqlalchemy import INTEGER, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship, Session
from app.models.main import Base
from app.utils.schemas_utils import CustomModel

class CompanyRoleMapBase(CustomModel):
    role_map_id: int | None = Field(default=None)
    company_id: int | None = Field(default=None)
    sf_role_id: int | None = Field(default=None)

class TblCompanyRoleMap(Base):
    __tablename__ = "tbl_company_role_map"

    role_map_id: Mapped[int] = mapped_column("role_map_id", INTEGER, primary_key=True, autoincrement=True)
    company_id: Mapped[int] = mapped_column("company_id",INTEGER,ForeignKey("tbl_company_list.company_id", ondelete="CASCADE"),nullable=False,)
    sf_role_id: Mapped[int] = mapped_column("sf_role_id",INTEGER,ForeignKey("tbl_seafarer_role.sf_role_id", ondelete="CASCADE"),nullable=False,)
   
    company = relationship("TblCompanyList", back_populates="roles")
    seafarer_role = relationship("TblSeafarerRole", back_populates="companies")
    course_roles = relationship("TblCompanyCourseRoleMap", back_populates="company_role_map")

    def __init__(self, company_id: int, sf_role_id: int):
        self.company_id = company_id
        self.sf_role_id = sf_role_id

    @classmethod
    def create(cls, data: CompanyRoleMapBase, db: Session) -> "TblCompanyRoleMap":
        data_dict = data.model_dump(exclude_unset=True)
        new_data = cls(**data_dict)
        db.add(new_data)
        db.flush()
        return new_data
