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

from app.models.database import Base


class AlfrescoFolder(Base):
    __tablename__ = "alfresco_folders"

    id: Mapped[str] = mapped_column(String(255), primary_key=True)
    site_id: Mapped[int] = mapped_column(ForeignKey("alfresco_sites.id", ondelete="CASCADE"), nullable=False)
    parent_id: Mapped[str | None] = mapped_column(String(255), ForeignKey("alfresco_folders.id", ondelete="CASCADE"), nullable=True)
    name: Mapped[str] = mapped_column(String(1024), nullable=False)
    node_path: Mapped[str | None] = mapped_column(Text, nullable=True)
    folder_type: Mapped[str | None] = mapped_column(String(100), nullable=True)
    child_count: Mapped[int] = mapped_column(Integer, default=0)
    has_children: Mapped[bool] = mapped_column(Boolean, default=False)
    has_index_xml: Mapped[bool] = mapped_column(Boolean, default=False)
    index_xml_node_id: Mapped[str | None] = mapped_column(String(255), nullable=True)
    deleted: Mapped[bool] = mapped_column(Boolean, default=False, server_default=text("false"))
    is_closed: Mapped[bool] = mapped_column(Boolean, default=False, server_default=text("false"))
    level: Mapped[int] = mapped_column(Integer, default=0)
    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())

    parent = relationship("AlfrescoFolder", remote_side=[id], back_populates="children")
    children = relationship("AlfrescoFolder", back_populates="parent", cascade="all, delete-orphan")
    site = relationship("AlfrescoSite", back_populates="folders")
