from datetime import datetime
from sqlalchemy import String, DateTime, Text, Boolean, ForeignKey, Integer, BigInteger, func, text
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.orm import Mapped, mapped_column, relationship

from app.models.database import Base


class AlfrescoFile(Base):
    __tablename__ = "alfresco_files"

    id: Mapped[str] = mapped_column(String(255), primary_key=True)
    folder_id: Mapped[str] = mapped_column(String(255), ForeignKey("alfresco_folders.id", ondelete="CASCADE"), nullable=False)
    name: Mapped[str] = mapped_column(String(1024), nullable=False)
    mimetype: Mapped[str | None] = mapped_column(String(255), nullable=True)
    size_bytes: Mapped[int | None] = mapped_column(BigInteger, nullable=True)
    alfresco_created_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
    alfresco_modified_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
    version: Mapped[str | None] = mapped_column(String(50), nullable=True)
    properties_json: Mapped[dict | None] = mapped_column(JSONB, nullable=True)
    sort_order: Mapped[int] = mapped_column(Integer, default=0)
    folios: Mapped[int] = mapped_column(Integer, default=1)
    deleted: Mapped[bool] = mapped_column(Boolean, default=False, server_default=text("false"))
    hash_sha256: Mapped[str | None] = mapped_column(String(64), nullable=True)
    synced_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
    created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
    updated_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), onupdate=func.now())

