"""
문서 모델
"""
from sqlalchemy import Column, String, DateTime, Text, Integer, Boolean, ForeignKey, Table
from sqlalchemy.dialects.postgresql import UUID, ARRAY
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
import uuid

from ..core.database import Base


# 문서-태그 다대다 관계 테이블
document_tags = Table(
    'document_tags',
    Base.metadata,
    Column('document_id', UUID(as_uuid=True), ForeignKey('documents.id'), primary_key=True),
    Column('tag_id', UUID(as_uuid=True), ForeignKey('tags.id'), primary_key=True)
)


class Document(Base):
    """문서 테이블"""
    __tablename__ = "documents"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    book_id = Column(UUID(as_uuid=True), ForeignKey('books.id'), nullable=True, index=True)  # 서적 ID
    category_id = Column(UUID(as_uuid=True), ForeignKey('book_categories.id'), nullable=True, index=True)  # 소분류 ID
    title = Column(String(500), nullable=False, index=True)
    sort_order = Column(Integer, default=0)  # 문서 정렬 순서 (소분류 내에서)
    description = Column(Text, nullable=True)
    
    # 파일 정보
    html_path = Column(String(1000), nullable=True)  # HTML 파일 경로 (PDF만 업로드하는 경우 null 가능)
    pdf_path = Column(String(1000), nullable=True)   # PDF 원본 경로 (선택)
    thumbnail_path = Column(String(1000), nullable=True)  # 썸네일 경로
    matched_pdf_id = Column(UUID(as_uuid=True), ForeignKey('documents.id'), nullable=True)  # 매칭된 PDF 문서 ID
    
    # 메타데이터
    file_size = Column(Integer, nullable=True)  # 바이트 단위
    page_count = Column(Integer, nullable=True)  # 페이지 수 (추정)
    language = Column(String(10), default="ko")  # 문서 언어
    
    # 업로드 정보
    uploaded_by = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False)
    original_filename = Column(String(500), nullable=True)
    
    # 상태
    is_public = Column(Boolean, default=False)  # 공개 여부
    is_processed = Column(Boolean, default=True)  # 처리 완료 여부
    
    # 시간 정보
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    updated_at = Column(DateTime(timezone=True), onupdate=func.now())
    document_date = Column(DateTime(timezone=True), nullable=True)  # 문서 작성일 (사용자 입력)
    
    # 관계
    book = relationship("Book", back_populates="documents")  # 서적 관계
    category = relationship("BookCategory", back_populates="documents")  # 소분류 관계
    uploader = relationship("User", backref="uploaded_documents")
    tags = relationship("Tag", secondary=document_tags, back_populates="documents")
    highlights = relationship("Highlight", back_populates="document", cascade="all, delete-orphan")
    bookmarks = relationship("Bookmark", back_populates="document", cascade="all, delete-orphan")

    def __repr__(self):
        return f"<Document(title='{self.title}', id='{self.id}')>"


class Tag(Base):
    """태그 테이블"""
    __tablename__ = "tags"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    name = Column(String(100), unique=True, nullable=False, index=True)
    color = Column(String(7), default="#3B82F6")  # HEX 색상 코드
    description = Column(Text, nullable=True)
    
    # 메타데이터
    created_by = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False)
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    
    # 관계
    creator = relationship("User", backref="created_tags")
    documents = relationship("Document", secondary=document_tags, back_populates="tags")

    def __repr__(self):
        return f"<Tag(name='{self.name}', color='{self.color}')>"
