-- 문서 chunk 단위 검색 테이블 (chunk 중심 retrieval)
-- Phase 0.1: 문서를 의미 단위(조항/문단/슬라이딩 윈도우)로 쪼개어 별도 테이블에 저장
-- 검색 품질 승부처는 chunk 품질 + reranker 입력 품질

CREATE TABLE document_chunks (
    id              BIGSERIAL PRIMARY KEY,
    doc_id          BIGINT REFERENCES documents(id) ON DELETE CASCADE NOT NULL,
    chunk_index     INTEGER NOT NULL,              -- 문서 내 순서

    -- chunking 전략 메타
    chunk_type      VARCHAR(30) NOT NULL,          -- legal_article | paragraph | section | window | email_body
    section_title   TEXT,                           -- "제80조", "3.1 Methods" 등
    heading_path    TEXT,                           -- "Chapter 3 > Section 2"
    page            INTEGER,                        -- PDF 페이지 번호

    -- 다국어 및 domain-aware retrieval 메타
    language        VARCHAR(10),                    -- ko | en | ja | zh | fr | de
    country         VARCHAR(10),                    -- KR | US | JP | CN | FR | DE (뉴스 필수)
    source          VARCHAR(100),                   -- 경향신문 | NYT | ... (뉴스 필수)
    domain_category VARCHAR(20) NOT NULL,           -- document | news (파이프라인 분기 키)

    -- 본문 + 임베딩
    text            TEXT NOT NULL,
    embedding       vector(1024),                   -- bge-m3

    created_at      TIMESTAMPTZ DEFAULT NOW(),
    updated_at      TIMESTAMPTZ DEFAULT NOW(),

    UNIQUE (doc_id, chunk_index)
);

-- 벡터 유사도 인덱스 (IVFFlat, cosine)
-- lists는 데이터 증가에 따라 조정 필요. 초기 500-5000 chunks 기준.
CREATE INDEX idx_chunks_embedding ON document_chunks
    USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);

-- FTS 인덱스 (simple tokenizer — 한국어는 trigram 보조)
CREATE INDEX idx_chunks_fts ON document_chunks
    USING GIN (to_tsvector('simple', text));

-- Trigram 인덱스 (한국어/부분매치 보조)
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE INDEX idx_chunks_trgm ON document_chunks
    USING GIN (text gin_trgm_ops);

-- 필터용 B-tree 인덱스
CREATE INDEX idx_chunks_doc_id ON document_chunks (doc_id);
CREATE INDEX idx_chunks_domain_category ON document_chunks (domain_category);
CREATE INDEX idx_chunks_country ON document_chunks (country) WHERE country IS NOT NULL;
CREATE INDEX idx_chunks_source ON document_chunks (source) WHERE source IS NOT NULL;
CREATE INDEX idx_chunks_language ON document_chunks (language) WHERE language IS NOT NULL;

-- chunk stage 추가 (processing_queue에서 chunk 단계로 처리)
ALTER TYPE process_stage ADD VALUE IF NOT EXISTS 'chunk';
