from sqlalchemy import CHAR, INTEGER, VARCHAR, TIMESTAMP, ForeignKey, text
from sqlalchemy.orm import Mapped, mapped_column, Session , relationship
from app.models.main import Base
from fastapi import HTTPException
from pydantic import Field
from datetime import datetime
from app.utils.schemas_utils import CustomModel
import uuid
class AdminBase(CustomModel):
    
    admin_id: int | None = Field(default=None)
    admin_uuid: uuid.UUID | None = Field(default=None)
    company_id: int | None = Field(default=None)
    role_id: int | None = Field(default=None)
    email_id: str | None = Field(default=None)
    user_name: str | None = Field(default=None)
    pass_word: str | None = Field(default=None)
    nick_name: str | None = Field(default=None)
    display_name: str | None = Field(default=None)
    company_name: str | None = Field(default=None)
class TblAdmin(Base):
    __tablename__ = "tbl_admin"

    admin_id: Mapped[int] = mapped_column(INTEGER, primary_key=True, autoincrement=True)
    admin_uuid: Mapped[str] = mapped_column(CHAR(36),default=lambda: str(uuid.uuid4()), unique=True, nullable=False)
    company_id: Mapped[int] = mapped_column(INTEGER, ForeignKey("tbl_company_list.company_id"), nullable=False)
    role_id: Mapped[int] = mapped_column(INTEGER, ForeignKey("tbl_role.role_id"), nullable=True)
    email_id : Mapped[str] = mapped_column(VARCHAR(50), nullable=True)
    user_name: Mapped[str] = mapped_column(VARCHAR(50), nullable=True)
    pass_word: Mapped[str] = mapped_column(VARCHAR(50), nullable=True)
    nick_name: Mapped[str] = mapped_column(VARCHAR(255), nullable=True)
    display_name: Mapped[str] = mapped_column(VARCHAR(255), nullable=True)
    company_name: Mapped[str] = mapped_column(VARCHAR(25), nullable=True)
    created_at: Mapped[datetime] = mapped_column(TIMESTAMP, nullable=False, server_default=text("current_timestamp()"))
    updated_at: Mapped[datetime] = mapped_column(TIMESTAMP, nullable=True, server_default=text("NULL ON UPDATE current_timestamp()"))

    company = relationship("TblCompanyList", back_populates="admins")
    role = relationship("TblRole", back_populates="admins")

    @classmethod
    def create(cls, data: AdminBase, db: Session) -> "TblAdmin":
        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, admin_id: int, db: Session) -> AdminBase:
        record = db.query(cls).filter(cls.admin_id == admin_id).first()
        if not record:
            raise HTTPException(status_code=404, detail="Admin not found")
        return AdminBase.model_validate(record)
    
    @classmethod
    def get_id(cls, admin_id: int, db: Session) -> "TblAdmin | None":
        return db.query(cls).filter(cls.admin_id == admin_id).first()

    # @classmethod
    # def update(cls, admin_id: int, data: AdminBase, db: Session) -> "TblAdmin":
    #     record = db.query(cls).filter(cls.admin_id == admin_id).first()
    #     if not record:
    #         raise HTTPException(status_code=404, detail="Admin not found")
    #     data_dict = data.model_dump()
    #     for key, value in data_dict.items():
    #         setattr(record, key, value)
    #     db.add(record)
    #     db.flush()
    #     return record

    @classmethod
    def update(cls, admin_id: int, data: AdminBase, db: Session) -> "TblAdmin | None":
        get_data = db.query(cls).filter(cls.admin_id == admin_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
