import uuid
from sqlalchemy import (
    Column,
    String,
    Date,
    Time,
    Integer,
    DateTime,
    ForeignKey,
    func,
    text,
)
from sqlalchemy.orm import relationship, Mapped, mapped_column
from app.models.base import BaseModel, BaseModelWihoutId


class PengajuanIjin(BaseModel):
    __tablename__ = "pengajuan_ijin"

    user_id = Column(
        String(36), ForeignKey("users.id", ondelete="NO ACTION"), nullable=True
    )
    kanit_id = Column(
        String(36), ForeignKey("users.id", ondelete="NO ACTION"), nullable=True
    )
    manager_id = Column(
        String(36), ForeignKey("users.id", ondelete="NO ACTION"), nullable=True
    )
    tu_id = Column(
        String(36), ForeignKey("users.id", ondelete="NO ACTION"), nullable=True
    )
    keterangan_id = Column(
        String(36), ForeignKey("keterangan.id", ondelete="NO ACTION"), nullable=True
    )

    status_slug = Column(
        String(255),
        ForeignKey("status.slug", ondelete="NO ACTION"),
        nullable=False,
        server_default=text("'diajukan'"),
        default=text("'diajukan'"),
    )

    start_date = Column(Date, nullable=False)
    end_date = Column(Date, nullable=False)
    start_time = Column(Time, nullable=False)
    end_time = Column(Time, nullable=False)
    jumlah_hari = Column(Integer, nullable=False)
    penyebab = Column(String(255), nullable=False)
    status = relationship("Status", foreign_keys=[status_slug], lazy="joined")
    user = relationship("User", foreign_keys=[user_id], lazy="joined")
    kanit = relationship("User", foreign_keys=[kanit_id], lazy="joined")
    manager = relationship("User", foreign_keys=[manager_id], lazy="joined")
    tu = relationship("User", foreign_keys=[tu_id], lazy="joined")
    keterangan = relationship("Keterangan", foreign_keys=[keterangan_id], lazy="joined")


class PengajuanIjinList(BaseModelWihoutId):
    __tablename__ = "ijin_items"
    id: Mapped[str] = mapped_column(
        String(36),
        default=lambda: str(uuid.uuid4()),
    )
    ijin_id = Column(
        String(36),
        ForeignKey("pengajuan_ijin.id", ondelete="NO ACTION"),
        nullable=False,
        primary_key=True,
    )
    date = Column(Date, nullable=False, primary_key=True)
