from sqlalchemy import Boolean, ForeignKey, String, Text, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.db.base import Base, SoftDeleteMixin, TimestampMixin


class Customer(Base, TimestampMixin, SoftDeleteMixin):
    __tablename__ = "customers"
    __table_args__ = (UniqueConstraint("agency_id", "mobile", name="uq_customers_agency_mobile"),)

    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    agency_id: Mapped[int] = mapped_column(ForeignKey("agencies.id"), nullable=False, index=True)
    name: Mapped[str] = mapped_column(String(255), nullable=False)
    mobile: Mapped[str] = mapped_column(String(20), nullable=False, index=True)
    email: Mapped[str | None] = mapped_column(String(255))
    address: Mapped[str | None] = mapped_column(Text)
    city: Mapped[str | None] = mapped_column(String(100))
    state: Mapped[str | None] = mapped_column(String(100))
    pincode: Mapped[str | None] = mapped_column(String(10))
    nominee_name: Mapped[str | None] = mapped_column(String(255))
    whatsapp_opt_out: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)

    agency: Mapped["Agency"] = relationship(back_populates="customers")
    vehicles: Mapped[list["Vehicle"]] = relationship(back_populates="customer")
    policies: Mapped[list["Policy"]] = relationship(back_populates="customer")


from app.models.agency import Agency  # noqa: E402
from app.models.policy import Policy  # noqa: E402
from app.models.vehicle import Vehicle  # noqa: E402
