-- RAG 회의록 테이블 생성
-- 회의록 정보를 embedding과 함께 저장하여 유사 회의록 검색에 사용

-- pgvector 확장이 이미 설치되어 있는지 확인 (terms 테이블용으로 설치되어 있음)
CREATE EXTENSION IF NOT EXISTS vector;

-- rag_minutes 테이블 생성
CREATE TABLE IF NOT EXISTS rag_minutes (
    -- Meeting 정보
    meeting_id VARCHAR(50) NOT NULL,
    title VARCHAR(200) NOT NULL,
    purpose VARCHAR(500),
    description TEXT,
    scheduled_at TIMESTAMP,
    location VARCHAR(200),
    organizer_id VARCHAR(50) NOT NULL,

    -- Minutes 정보
    minutes_id VARCHAR(50) PRIMARY KEY,
    minutes_status VARCHAR(20) NOT NULL DEFAULT 'FINALIZED',
    minutes_version INTEGER NOT NULL DEFAULT 1,
    created_by VARCHAR(50) NOT NULL,
    finalized_by VARCHAR(50),
    finalized_at TIMESTAMP,

    -- 회의록 섹션 (JSON 형태로 저장)
    sections JSONB,

    -- 전체 회의록 내용 (검색용 텍스트)
    full_content TEXT NOT NULL,

    -- Embedding 벡터 (1536 차원)
    embedding vector(1536),

    -- 메타데이터
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 인덱스 생성
-- Meeting ID로 검색
CREATE INDEX IF NOT EXISTS idx_rag_minutes_meeting_id
ON rag_minutes(meeting_id);

-- 제목으로 검색 (Full-text search)
CREATE INDEX IF NOT EXISTS idx_rag_minutes_title
ON rag_minutes(title);

-- 확정 일시로 정렬
CREATE INDEX IF NOT EXISTS idx_rag_minutes_finalized_at
ON rag_minutes(finalized_at DESC);

-- 작성자로 검색
CREATE INDEX IF NOT EXISTS idx_rag_minutes_created_by
ON rag_minutes(created_by);

-- 벡터 유사도 검색용 인덱스 (IVFFlat)
-- lists 파라미터는 데이터 크기에 따라 조정 (작은 데이터셋의 경우 100 정도가 적당)
CREATE INDEX IF NOT EXISTS idx_rag_minutes_embedding
ON rag_minutes USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);

-- Full-text search를 위한 GIN 인덱스
CREATE INDEX IF NOT EXISTS idx_rag_minutes_full_content_gin
ON rag_minutes USING gin(to_tsvector('simple', full_content));

-- 코멘트 추가
COMMENT ON TABLE rag_minutes IS '회의록 RAG 저장소 - Embedding 벡터와 함께 저장된 회의록 정보';
COMMENT ON COLUMN rag_minutes.meeting_id IS '회의 ID';
COMMENT ON COLUMN rag_minutes.title IS '회의 제목';
COMMENT ON COLUMN rag_minutes.purpose IS '회의 목적';
COMMENT ON COLUMN rag_minutes.minutes_id IS '회의록 ID (Primary Key)';
COMMENT ON COLUMN rag_minutes.sections IS '회의록 섹션 목록 (JSON 배열)';
COMMENT ON COLUMN rag_minutes.full_content IS '전체 회의록 내용 (검색용 텍스트)';
COMMENT ON COLUMN rag_minutes.embedding IS 'OpenAI text-embedding-ada-002 벡터 (1536차원)';
COMMENT ON COLUMN rag_minutes.created_at IS '레코드 생성 일시';
COMMENT ON COLUMN rag_minutes.updated_at IS '레코드 수정 일시';
