import uuid
from datetime import datetime

from sqlalchemy import ForeignKey, String, text
from sqlalchemy.dialects.postgresql import ENUM as PGEnum, JSONB, TIMESTAMP, UUID as PGUUID
from sqlalchemy.orm import Mapped, mapped_column

from app.models.base import Base, TenantScopedMixin, TimestampMixin, UUIDPKMixin

ai_target_type = PGEnum("master", "form", "task_custom_code", "page", name="ai_target_type", create_type=False)


class AuditLogEntry(UUIDPKMixin, TenantScopedMixin, Base):
    __tablename__ = "audit_log_entries"

    actor_id: Mapped[uuid.UUID | None] = mapped_column(PGUUID(as_uuid=True), ForeignKey("users.id"))
    action: Mapped[str] = mapped_column(String(100), nullable=False)
    entity_type: Mapped[str | None] = mapped_column(String(100))
    entity_id: Mapped[uuid.UUID | None] = mapped_column(PGUUID(as_uuid=True))
    details: Mapped[dict | None] = mapped_column(JSONB)
    occurred_at: Mapped[datetime] = mapped_column(TIMESTAMP(timezone=True), server_default=text("now()"))


class AiAssistantSession(UUIDPKMixin, TenantScopedMixin, TimestampMixin, Base):
    __tablename__ = "ai_assistant_sessions"

    user_id: Mapped[uuid.UUID] = mapped_column(PGUUID(as_uuid=True), ForeignKey("users.id"), nullable=False)
    target_type: Mapped[str] = mapped_column(ai_target_type, nullable=False)
    target_id: Mapped[uuid.UUID | None] = mapped_column(PGUUID(as_uuid=True))
    prompts: Mapped[list] = mapped_column(JSONB, nullable=False, server_default="[]")
    resulting_schema: Mapped[dict | None] = mapped_column(JSONB)
    model_name: Mapped[str] = mapped_column(String(100), nullable=False)
