-- 노트 링크 테이블 생성
-- 노트 문서 간 또는 노트-문서 간 링크를 관리하는 테이블

CREATE TABLE IF NOT EXISTS note_links (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    
    -- 링크 출발점 (노트 또는 문서 중 하나)
    source_note_id UUID REFERENCES notes_documents(id) ON DELETE CASCADE,
    source_document_id UUID REFERENCES documents(id) ON DELETE CASCADE,
    
    -- 링크 도착점 (노트 또는 문서 중 하나)
    target_note_id UUID REFERENCES notes_documents(id) ON DELETE CASCADE,
    target_document_id UUID REFERENCES documents(id) ON DELETE CASCADE,
    
    -- 출발점 텍스트 정보
    selected_text TEXT NOT NULL,
    start_offset INTEGER NOT NULL,
    end_offset INTEGER NOT NULL,
    
    -- 도착점 텍스트 정보 (선택사항)
    target_text TEXT,
    target_start_offset INTEGER,
    target_end_offset INTEGER,
    
    -- 링크 메타데이터
    link_text VARCHAR(500),
    description TEXT,
    link_type VARCHAR(20) DEFAULT 'note' NOT NULL,
    
    -- 생성자 및 시간 정보
    created_by UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE,
    
    -- 제약 조건
    CONSTRAINT note_links_source_check CHECK (
        (source_note_id IS NOT NULL AND source_document_id IS NULL) OR
        (source_note_id IS NULL AND source_document_id IS NOT NULL)
    ),
    CONSTRAINT note_links_target_check CHECK (
        (target_note_id IS NOT NULL AND target_document_id IS NULL) OR
        (target_note_id IS NULL AND target_document_id IS NOT NULL)
    )
);

-- 인덱스 생성
CREATE INDEX IF NOT EXISTS idx_note_links_source_note ON note_links(source_note_id);
CREATE INDEX IF NOT EXISTS idx_note_links_source_document ON note_links(source_document_id);
CREATE INDEX IF NOT EXISTS idx_note_links_target_note ON note_links(target_note_id);
CREATE INDEX IF NOT EXISTS idx_note_links_target_document ON note_links(target_document_id);
CREATE INDEX IF NOT EXISTS idx_note_links_created_by ON note_links(created_by);
CREATE INDEX IF NOT EXISTS idx_note_links_created_at ON note_links(created_at);

-- updated_at 자동 업데이트 트리거
CREATE OR REPLACE FUNCTION update_note_links_updated_at()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = NOW();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_note_links_updated_at
    BEFORE UPDATE ON note_links
    FOR EACH ROW
    EXECUTE FUNCTION update_note_links_updated_at();

-- 코멘트 추가
COMMENT ON TABLE note_links IS '노트 문서 간 링크 관리 테이블';
COMMENT ON COLUMN note_links.source_note_id IS '출발점 노트 ID (노트에서 시작하는 링크)';
COMMENT ON COLUMN note_links.source_document_id IS '출발점 문서 ID (문서에서 시작하는 링크)';
COMMENT ON COLUMN note_links.target_note_id IS '도착점 노트 ID';
COMMENT ON COLUMN note_links.target_document_id IS '도착점 문서 ID';
COMMENT ON COLUMN note_links.link_type IS '링크 타입: note, document, text_fragment';
