import uuid
from datetime import datetime, date, timezone
from typing import List, Optional
from sqlalchemy import String, Boolean, Integer, Date, DateTime, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.core.database import Base


class Employee(Base):
    __tablename__ = "employees"

    id: Mapped[str] = mapped_column(
        String, primary_key=True, default=lambda: str(uuid.uuid4())
    )
    name: Mapped[str] = mapped_column(String, nullable=False)
    account_name: Mapped[str] = mapped_column(String, nullable=False)
    account_number: Mapped[str] = mapped_column(String, nullable=False)
    company_id: Mapped[Optional[str]] = mapped_column(
        String, ForeignKey("companies.id", ondelete="SET NULL"), nullable=True
    )
    hire_date: Mapped[Optional[date]] = mapped_column(Date, nullable=True)
    base_salary: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
    active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
    created_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
    )
    updated_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        default=lambda: datetime.now(timezone.utc),
        onupdate=lambda: datetime.now(timezone.utc),
    )

    company_rel: Mapped[Optional["Company"]] = relationship(
        "Company", back_populates="employees"
    )
    salary_history: Mapped[List["SalaryHistory"]] = relationship(
        "SalaryHistory",
        back_populates="employee",
        cascade="all, delete-orphan",
        order_by="SalaryHistory.effective_date",
    )
    loans: Mapped[List["Loan"]] = relationship(
        "Loan",
        back_populates="employee",
        cascade="all, delete-orphan",
    )
    benefits: Mapped[List["Benefit"]] = relationship(
        "Benefit",
        back_populates="employee",
        cascade="all, delete-orphan",
    )
