"""
노트 문서 링크 모델
"""
from sqlalchemy import Column, String, DateTime, Text, Integer, ForeignKey
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
import uuid

from ..core.database import Base


class NoteLink(Base):
    """노트 문서 링크 테이블"""
    __tablename__ = "note_links"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    
    # 링크가 생성된 노트 (출발점) - 노트 문서 또는 일반 문서 가능
    source_note_id = Column(UUID(as_uuid=True), ForeignKey('notes_documents.id'), nullable=True, index=True)
    source_document_id = Column(UUID(as_uuid=True), ForeignKey('documents.id'), nullable=True, index=True)
    
    # 링크 대상 노트 (도착점) - 노트 문서 또는 일반 문서 가능
    target_note_id = Column(UUID(as_uuid=True), ForeignKey('notes_documents.id'), nullable=True, index=True)
    target_document_id = Column(UUID(as_uuid=True), ForeignKey('documents.id'), nullable=True, index=True)
    
    # 출발점 텍스트 정보
    selected_text = Column(Text, nullable=False)  # 선택된 텍스트
    start_offset = Column(Integer, nullable=False)  # 시작 위치
    end_offset = Column(Integer, nullable=False)    # 끝 위치
    
    # 도착점 텍스트 정보
    target_text = Column(Text, nullable=True)       # 대상에서 선택된 텍스트
    target_start_offset = Column(Integer, nullable=True)  # 대상에서 시작 위치
    target_end_offset = Column(Integer, nullable=True)    # 대상에서 끝 위치
    
    # 링크 메타데이터
    link_text = Column(String(500), nullable=True)  # 사용자 정의 링크 텍스트
    description = Column(Text, nullable=True)       # 링크 설명
    
    # 링크 타입
    link_type = Column(String(20), default="note", nullable=False)  # "note", "document", "text_fragment"
    
    # 생성자 정보
    created_by = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False)
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    updated_at = Column(DateTime(timezone=True), onupdate=func.now())
    
    # 관계 설정
    source_note = relationship("NoteDocument", foreign_keys=[source_note_id], backref="outgoing_note_links")
    source_document = relationship("Document", foreign_keys=[source_document_id], backref="outgoing_note_links")
    target_note = relationship("NoteDocument", foreign_keys=[target_note_id], backref="incoming_note_links")
    target_document = relationship("Document", foreign_keys=[target_document_id], backref="incoming_note_links")
    creator = relationship("User", backref="created_note_links")
    
    def __repr__(self):
        return f"<NoteLink(id={self.id}, source_note={self.source_note_id}, target_note={self.target_note_id})>"

