from sqlalchemy import (
    String,
    ForeignKey,
    Index,
    Numeric,
)
from sqlalchemy.orm import mapped_column, Mapped
from Controllers.Postgres.mixin import CrudCollection


class Staff(CrudCollection):

    __tablename__ = "staff"
    __exclude__fields__ = []

    staff_description: Mapped[str] = mapped_column(
        String, server_default="", comment="Staff Description"
    )
    staff_name: Mapped[str] = mapped_column(
        String, nullable=False, comment="Staff Name"
    )
    staff_code: Mapped[str] = mapped_column(
        String, nullable=False, comment="Staff Code"
    )

    duties_id: Mapped[int] = mapped_column(ForeignKey("duties.id"), nullable=False)
    duties_uu_id: Mapped[str] = mapped_column(
        String, nullable=False, comment="Duty UUID"
    )

    __table_args__ = ({"comment": "Staff Information"},)


class Employees(CrudCollection):

    __tablename__ = "employees"
    __exclude__fields__ = []

    staff_id: Mapped[int] = mapped_column(ForeignKey("staff.id"))
    staff_uu_id: Mapped[str] = mapped_column(
        String, nullable=False, comment="Staff UUID"
    )
    people_id: Mapped[int] = mapped_column(ForeignKey("people.id"), nullable=True)
    people_uu_id: Mapped[str] = mapped_column(
        String, nullable=True, comment="People UUID"
    )

    __table_args__ = (
        Index("employees_ndx_00", people_id, staff_id, unique=True),
        {"comment": "Employee Person Information"},
    )


class EmployeeHistory(CrudCollection):

    __tablename__ = "employee_history"
    __exclude__fields__ = []

    staff_id: Mapped[int] = mapped_column(
        ForeignKey("staff.id"), nullable=False, comment="Staff ID"
    )
    staff_uu_id: Mapped[str] = mapped_column(
        String, nullable=False, comment="Staff UUID"
    )
    people_id: Mapped[int] = mapped_column(
        ForeignKey("people.id"), nullable=False, comment="People ID"
    )
    people_uu_id: Mapped[str] = mapped_column(
        String, nullable=False, comment="People UUID"
    )

    __table_args__ = (
        Index("_employee_history_ndx_00", people_id, staff_id),
        {"comment": "Employee History Information"},
    )


class EmployeesSalaries(CrudCollection):

    __tablename__ = "employee_salaries"
    __exclude__fields__ = []

    gross_salary: Mapped[float] = mapped_column(
        Numeric(20, 6), nullable=False, comment="Gross Salary"
    )
    net_salary: Mapped[float] = mapped_column(
        Numeric(20, 6), nullable=False, comment="Net Salary"
    )
    people_id: Mapped[int] = mapped_column(ForeignKey("people.id"), nullable=False)
    people_uu_id: Mapped[str] = mapped_column(
        String, nullable=False, comment="People UUID"
    )

    __table_args__ = (
        Index("_employee_salaries_ndx_00", people_id, "expiry_starts"),
        {"comment": "Employee Salaries Information"},
    )
