import {
  PAPER_MEMORY_CHUNKING_VERSION,
  PAPER_MEMORY_EXTRACTOR_VERSION,
  PAPER_MEMORY_SCHEMA_VERSION,
  type PaperIndexGeneration,
} from './types';

export type PaperIndexCompatibility =
  | { status: 'compatible' }
  | { status: 'reindex-required'; reason: string };

/**
 * Structural index compatibility is intentionally separate from embedding
 * compatibility. Embedding models can be regenerated from committed chunks;
 * extractor/chunker/schema changes require a local PDF re-index so provenance
 * and chunk semantics remain trustworthy.
 */
export function paperIndexCompatibility(index: PaperIndexGeneration): PaperIndexCompatibility {
  if (index.schemaVersion !== PAPER_MEMORY_SCHEMA_VERSION) {
    return { status: 'reindex-required', reason: `schema ${index.schemaVersion} != ${PAPER_MEMORY_SCHEMA_VERSION}` };
  }
  if (index.extractorVersion !== PAPER_MEMORY_EXTRACTOR_VERSION) {
    return { status: 'reindex-required', reason: `extractor ${index.extractorVersion} != ${PAPER_MEMORY_EXTRACTOR_VERSION}` };
  }
  if (index.chunkingVersion !== PAPER_MEMORY_CHUNKING_VERSION) {
    return { status: 'reindex-required', reason: `chunker ${index.chunkingVersion} != ${PAPER_MEMORY_CHUNKING_VERSION}` };
  }
  for (const chunk of index.chunks) {
    if (chunk.paperId !== index.paperId || chunk.pageStart < 1 || chunk.pageEnd < chunk.pageStart) {
      return { status: 'reindex-required', reason: 'invalid chunk provenance' };
    }
  }
  return { status: 'compatible' };
}
