# FILE: src/apps/records/models/record.py
from __future__ import annotations

from datetime import date
from typing import TYPE_CHECKING, List, Optional
from uuid import UUID

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

from src.database.base import TenantSoftDeleteModel

if TYPE_CHECKING:
    from src.apps.memorials.models.memorial import Memorial
    from src.apps.plots.models.plot import Plot
    from src.apps.records.models.burial_info import BurialInfo
    from src.apps.records.models.family_contact import FamilyContact


class Record(TenantSoftDeleteModel):
    __tablename__ = "records"

    __table_args__ = (
        Index("idx_records_tenant_name", "tenant_id", "first_name", "last_name"),
    )

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

    plot_id: Mapped[Optional[UUID]] = mapped_column(
        PG_UUID(as_uuid=True),
        ForeignKey("plots.id", ondelete="SET NULL"),
        nullable=True,
        index=True,
    )

    first_name: Mapped[str] = mapped_column(String(100), nullable=False)
    middle_name: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    last_name: Mapped[str] = mapped_column(String(100), nullable=False)
    maiden_name: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    date_of_birth: Mapped[Optional[date]] = mapped_column(Date, nullable=True)
    date_of_death: Mapped[Optional[date]] = mapped_column(Date, nullable=True)
    gender: Mapped[Optional[str]] = mapped_column(String(20), nullable=True)
    nationality: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    religion: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    is_veteran: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
    military_branch: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
    photo_url: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    biography_draft: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    visibility_config: Mapped[str] = mapped_column(
        String(20), default="public", nullable=False
    )
    status: Mapped[str] = mapped_column(String(20), default='active', nullable=False)
    headstone_photo_s3_key: Mapped[Optional[str]] = mapped_column(Text, nullable=True)

    # Relationships
    plot: Mapped[Optional["Plot"]] = relationship("Plot", back_populates="record")
    burial_info: Mapped[Optional["BurialInfo"]] = relationship(
        "BurialInfo", uselist=False, back_populates="record"
    )
    family_contacts: Mapped[List["FamilyContact"]] = relationship(
        "FamilyContact", back_populates="record"
    )
    memorial: Mapped[Optional["Memorial"]] = relationship(
        "Memorial", uselist=False, back_populates="record"
    )
