"""SQLAlchemy ORM models for Randevu."""
from datetime import datetime, timezone
import uuid
from sqlalchemy import String, Integer, Text, DateTime, JSON
from sqlalchemy.orm import Mapped, mapped_column
from database import Base


def _uuid() -> str:
    return str(uuid.uuid4())


def _now_iso() -> str:
    return datetime.now(timezone.utc).isoformat()


class Admin(Base):
    __tablename__ = "admins"
    id: Mapped[str] = mapped_column(String(64), primary_key=True, default=_uuid)
    username: Mapped[str] = mapped_column(String(80), unique=True, index=True)
    password_hash: Mapped[str] = mapped_column(String(255))
    created_at: Mapped[str] = mapped_column(String(64), default=_now_iso)


class Setting(Base):
    __tablename__ = "settings"
    key: Mapped[str] = mapped_column(String(80), primary_key=True)
    value: Mapped[str] = mapped_column(Text, default="")


class Pill(Base):
    __tablename__ = "pills"
    id: Mapped[str] = mapped_column(String(64), primary_key=True, default=_uuid)
    side: Mapped[str] = mapped_column(String(10))
    label: Mapped[str] = mapped_column(String(255))
    order: Mapped[int] = mapped_column(Integer, default=0)


class TimelineItem(Base):
    __tablename__ = "timeline"
    id: Mapped[str] = mapped_column(String(64), primary_key=True, default=_uuid)
    period: Mapped[str] = mapped_column(String(255))
    title: Mapped[str] = mapped_column(String(500))
    bullets: Mapped[list] = mapped_column(JSON, default=list)
    order: Mapped[int] = mapped_column(Integer, default=0)


class Service(Base):
    __tablename__ = "services"
    id: Mapped[str] = mapped_column(String(64), primary_key=True, default=_uuid)
    title: Mapped[str] = mapped_column(String(500))
    content: Mapped[str] = mapped_column(Text, default="")
    order: Mapped[int] = mapped_column(Integer, default=0)


class Project(Base):
    __tablename__ = "projects"
    id: Mapped[str] = mapped_column(String(64), primary_key=True, default=_uuid)
    title: Mapped[str] = mapped_column(String(500))
    address: Mapped[str] = mapped_column(String(500), default="")
    street: Mapped[str] = mapped_column(String(500), default="")
    image: Mapped[str] = mapped_column(String(1024), default="")
    order: Mapped[int] = mapped_column(Integer, default=0)


class BlogPost(Base):
    __tablename__ = "blog"
    id: Mapped[str] = mapped_column(String(64), primary_key=True, default=_uuid)
    title: Mapped[str] = mapped_column(String(500))
    content: Mapped[str] = mapped_column(Text, default="")
    image: Mapped[str] = mapped_column(String(1024), default="")
    order: Mapped[int] = mapped_column(Integer, default=0)


class Doctor(Base):
    __tablename__ = "doctors"
    id: Mapped[str] = mapped_column(String(64), primary_key=True, default=_uuid)
    name: Mapped[str] = mapped_column(String(255))
    specialty: Mapped[str] = mapped_column(String(255), default="")
    education: Mapped[str] = mapped_column(Text, default="")
    diseases: Mapped[str] = mapped_column(Text, default="")
    image: Mapped[str] = mapped_column(String(1024), default="")
    order: Mapped[int] = mapped_column(Integer, default=0)


class ContactSubmission(Base):
    __tablename__ = "contacts"
    id: Mapped[str] = mapped_column(String(64), primary_key=True, default=_uuid)
    surname: Mapped[str] = mapped_column(String(255), default="")
    name: Mapped[str] = mapped_column(String(255), default="")
    fatherName: Mapped[str] = mapped_column(String(255), default="")
    birth: Mapped[str] = mapped_column(String(64), default="")
    phone: Mapped[str] = mapped_column(String(64), default="")
    city: Mapped[str] = mapped_column(String(255), default="")
    specialty: Mapped[str] = mapped_column(String(255), default="")
    workplace: Mapped[str] = mapped_column(String(255), default="")
    position: Mapped[str] = mapped_column(String(255), default="")
    createdAt: Mapped[str] = mapped_column(String(64), default=_now_iso)


class ChatSession(Base):
    __tablename__ = "chat_sessions"
    id: Mapped[str] = mapped_column(String(64), primary_key=True, default=_uuid)
    visitor_name: Mapped[str] = mapped_column(String(255), default="")
    createdAt: Mapped[str] = mapped_column(String(64), default=_now_iso)
    lastActivity: Mapped[str] = mapped_column(String(64), default=_now_iso)


class ChatMessage(Base):
    __tablename__ = "chat_messages"
    id: Mapped[str] = mapped_column(String(64), primary_key=True, default=_uuid)
    session_id: Mapped[str] = mapped_column(String(64), index=True)
    role: Mapped[str] = mapped_column(String(20))  # 'user' | 'assistant' | 'admin'
    content: Mapped[str] = mapped_column(Text)
    createdAt: Mapped[str] = mapped_column(String(64), default=_now_iso)


# Registry for the CRUD factory
ENTITY_MAP = {
    "pills": Pill,
    "timeline": TimelineItem,
    "services": Service,
    "projects": Project,
    "blog": BlogPost,
    "doctors": Doctor,
}
