import uuid

from pgvector.sqlalchemy import Vector
from sqlalchemy import ForeignKey, Index, String, Text
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.models.base import Base, TimestampMixin, UUIDPrimaryKey


class Garment(UUIDPrimaryKey, TimestampMixin, Base):
    __tablename__ = "garments"

    user_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"))
    category_main: Mapped[str] = mapped_column(String(20))
    category_sub: Mapped[str | None] = mapped_column(String(50))
    description: Mapped[str | None] = mapped_column(Text)
    tags: Mapped[dict | None] = mapped_column(JSONB)
    source_image_path: Mapped[str | None] = mapped_column(String(500))
    ghost_image_path: Mapped[str | None] = mapped_column(String(500))
    embedding = mapped_column(Vector(1536), nullable=True)

    user = relationship("User", back_populates="garments")

    __table_args__ = (
        Index("ix_garments_user_id", "user_id"),
        Index("ix_garments_category_main", "category_main"),
        Index("ix_garments_tags", "tags", postgresql_using="gin"),
    )
