"""RAG bilgi tabanı ORM: FlovyKnowledgeSource, FlovyKnowledgeChunk. Tablo şeması."""
from datetime import datetime

from sqlalchemy import (
    JSON,
    DateTime,
    Enum,
    ForeignKey,
    Index,
    Integer,
    String,
    Text,
    func,
)
from sqlalchemy.orm import Mapped, mapped_column

from app.database import Base, UUIDMixin

SOURCE_TYPE = ("product", "faq", "url", "pdf", "manual")
SOURCE_STATUS = ("pending", "indexing", "indexed", "failed")


class FlovyKnowledgeSource(UUIDMixin, Base):
    __tablename__ = "flovy_knowledge_sources"

    tenant_id: Mapped[str] = mapped_column(
        String(36), ForeignKey("tenants.id", ondelete="CASCADE"), nullable=False, index=True
    )
    source_type: Mapped[str] = mapped_column(
        Enum(*SOURCE_TYPE, name="ks_source_type"), nullable=False
    )
    title: Mapped[str | None] = mapped_column(String(500), nullable=True)
    url: Mapped[str | None] = mapped_column(String(1000), nullable=True)
    content: Mapped[str | None] = mapped_column(Text, nullable=True)
    status: Mapped[str] = mapped_column(
        Enum(*SOURCE_STATUS, name="ks_status"), default="pending", server_default="pending"
    )
    chunk_count: Mapped[int] = mapped_column(Integer, default=0, server_default="0")
    last_indexed_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
    error_message: Mapped[str | None] = mapped_column(Text, nullable=True)
    created_at: Mapped[datetime] = mapped_column(
        DateTime, server_default=func.now(), nullable=False
    )


class FlovyKnowledgeChunk(UUIDMixin, Base):
    __tablename__ = "flovy_knowledge_chunks"
    __table_args__ = (
        Index("idx_chunk_tenant_source_type", "tenant_id", "source_type"),
    )

    tenant_id: Mapped[str] = mapped_column(
        String(36), ForeignKey("tenants.id", ondelete="CASCADE"), nullable=False
    )
    source_id: Mapped[str] = mapped_column(
        String(36),
        ForeignKey("flovy_knowledge_sources.id", ondelete="CASCADE"),
        nullable=False,
    )
    source_type: Mapped[str] = mapped_column(String(20), nullable=False)
    content: Mapped[str] = mapped_column(Text, nullable=False)
    embedding: Mapped[list | None] = mapped_column(JSON, nullable=True)
    embedding_model: Mapped[str | None] = mapped_column(String(100), nullable=True)
    meta: Mapped[dict | None] = mapped_column(JSON, nullable=True)
    created_at: Mapped[datetime] = mapped_column(
        DateTime, server_default=func.now(), nullable=False
    )
