// {{projectName}} — Prisma schema (ai-rag-platform baseline)
//
// Requires: PostgreSQL + pgvector extension.
// Setup:
//   docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=postgres pgvector/pgvector:pg16
//   psql ... -c "CREATE EXTENSION IF NOT EXISTS vector;"
//   npx prisma db push

generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["postgresqlExtensions"]
}

datasource db {
  provider   = "postgresql"
  url        = env("DATABASE_URL")
  extensions = [vector]
}

// 문서 처리 상태: UPLOADED → PARSING → PARSED → EMBEDDING → READY (or FAILED)
model Document {
  id            String   @id @default(cuid())
  filename      String
  originalName  String
  contentType   String?
  fileSize      Int?
  status        String   @default("UPLOADED")
  pageCount     Int?
  summary       String?
  errorMessage  String?
  createdAt     DateTime @default(now())
  updatedAt     DateTime @updatedAt

  chunks DocumentChunk[]
}

model DocumentChunk {
  id          String   @id @default(cuid())
  documentId  String
  content     String
  pageNumber  Int?
  chunkIndex  Int
  /// pgvector embedding. Dimension matches EMBEDDING_DIM env (default 1024).
  embedding   Unsupported("vector")?
  createdAt   DateTime @default(now())

  document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)

  @@index([documentId])
}

model ChatSession {
  id          String   @id @default(cuid())
  /// JSON array of Document.id values participating in this session.
  documentIds Json
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt

  messages ChatMessage[]
}

model ChatMessage {
  id           String   @id @default(cuid())
  sessionId    String
  role         String   // USER | ASSISTANT
  content      String
  /// Source chunk ids used to ground the answer (assistant only).
  sourceChunks Json?
  createdAt    DateTime @default(now())

  session ChatSession @relation(fields: [sessionId], references: [id], onDelete: Cascade)

  @@index([sessionId])
}
