# FILE: src/apps/crew_members/models/crew_member.py
from __future__ import annotations

from uuid import UUID

from sqlalchemy import Boolean, ForeignKey, Index, String, Text, text
from sqlalchemy.dialects.postgresql import UUID as PG_UUID
from sqlalchemy.orm import Mapped, mapped_column

from src.database.base import TenantSoftDeleteModel


class CrewMember(TenantSoftDeleteModel):
    """Cemetery field-staff (crew) roster, per tenant (INDL-33).

    Contact records only — crew members have no login credentials, no role,
    and no session. `email` is contact data, never an authentication identifier.
    """

    __tablename__ = "crew_members"

    __table_args__ = (
        # Standard soft-delete query path.
        Index("ix_crew_members_tenant_deleted", "tenant_id", "deleted_at"),
        # Partial unique index — one active email per tenant. Soft-deleted rows
        # are excluded so an email can be reused after a crew member is removed.
        Index(
            "uq_crew_members_tenant_email",
            "tenant_id",
            "email",
            unique=True,
            postgresql_where=text("deleted_at IS NULL"),
        ),
    )

    # Override tenant_id with an explicit FK to accounts.
    tenant_id: Mapped[UUID] = mapped_column(
        PG_UUID(as_uuid=True),
        ForeignKey("accounts.id", ondelete="CASCADE"),
        nullable=False,
        index=True,
    )

    name: Mapped[str] = mapped_column(String(255), nullable=False)
    email: Mapped[str] = mapped_column(String(255), nullable=False)
    phone: Mapped[str] = mapped_column(String(50), nullable=False)
    address: Mapped[str] = mapped_column(Text, nullable=False)
    is_available: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
