from sqlalchemy import ARRAY, ForeignKey, Integer, Text
from sqlalchemy.orm import Mapped, mapped_column

from scribe.models import Base
from scribe.models.base import CreatedAtMixin, iso


class NoteVersion(Base, CreatedAtMixin):
    __tablename__ = "note_versions"

    id: Mapped[int] = mapped_column(primary_key=True)
    note_id: Mapped[int] = mapped_column(Integer, ForeignKey("notes.id", ondelete="CASCADE"))
    user_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id", ondelete="CASCADE"))
    body: Mapped[str] = mapped_column(Text)
    title: Mapped[str] = mapped_column(Text, default="")
    tags: Mapped[list[str]] = mapped_column(ARRAY(Text), default=list)
    pin_kind: Mapped[str | None] = mapped_column(Text, nullable=True)
    pin_label: Mapped[str | None] = mapped_column(Text, nullable=True)

    def to_dict(self, include_body: bool = True) -> dict:
        d: dict = {
            "id": self.id,
            "note_id": self.note_id,
            "user_id": self.user_id,
            "title": self.title,
            "tags": self.tags or [],
            "pin_kind": self.pin_kind,
            "pin_label": self.pin_label,
            "created_at": iso(self.created_at),
        }
        if include_body:
            d["body"] = self.body
        return d
