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

from app.models.database import Base


class AlfrescoSite(Base):
    __tablename__ = "alfresco_sites"

    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    connection_id: Mapped[int] = mapped_column(ForeignKey("alfresco_connections.id"), nullable=False)
    name: Mapped[str] = mapped_column(String(255), nullable=False)
    site_id: Mapped[str] = mapped_column(String(255), nullable=False)
    title: Mapped[str] = mapped_column(String(512), nullable=True)
    description: Mapped[str | None] = mapped_column(Text, nullable=True)
    visibility: Mapped[str] = mapped_column(String(50), default="PUBLIC")
    root_folder_id: Mapped[str] = mapped_column(String(255), nullable=True)
    root_folder_path: Mapped[str] = mapped_column(String(1024), nullable=True)
    document_library_id: Mapped[str] = mapped_column(String(255), nullable=True)
    site_preset: Mapped[str] = mapped_column(String(100), nullable=True)
    site_role: Mapped[str | None] = mapped_column(String(50), nullable=True)
    metadata_json: Mapped[dict | None] = mapped_column(JSONB, nullable=True)
    active: Mapped[bool] = mapped_column(Boolean, default=True)
    last_sync_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())

    connection = relationship("AlfrescoConnection", back_populates="sites")
    folders = relationship("AlfrescoFolder", back_populates="site", cascade="all, delete-orphan")
