generator client {
  provider      = "prisma-client-js"
  output        = "./client-generated"
  binaryTargets = ["debian-openssl-3.0.x", "native"]
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id                 String              @id @default(cuid())
  name               String?
  email              String              @unique
  emailVerified      DateTime?
  password           String?
  role               String              @default("USER")
  image              String?
  theme              String              @default("light")
  resetToken         String?             @unique
  resetTokenExpiry   DateTime?
  createdAt          DateTime            @default(now())
  updatedAt          DateTime            @updatedAt
  accounts           Account[]
  aiFeedback         AiFeedback[]
  labels             Label[]
  memoryEchoInsights MemoryEchoInsight[]
  notes              Note[]
  sentShares         NoteShare[]         @relation("SentShares")
  receivedShares     NoteShare[]         @relation("ReceivedShares")
  notebooks          Notebook[]
  sessions           Session[]
  aiSettings         UserAISettings?
}

model Account {
  userId            String
  type              String
  provider          String
  providerAccountId String
  refresh_token     String?
  access_token      String?
  expires_at        Int?
  token_type        String?
  scope             String?
  id_token          String?
  session_state     String?
  createdAt         DateTime @default(now())
  updatedAt         DateTime @updatedAt
  user              User     @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@id([provider, providerAccountId])
}

model Session {
  sessionToken String   @unique
  userId       String
  expires      DateTime
  createdAt    DateTime @default(now())
  updatedAt    DateTime @updatedAt
  user         User     @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model VerificationToken {
  identifier String
  token      String
  expires    DateTime

  @@id([identifier, token])
}

model Notebook {
  id        String   @id @default(cuid())
  name      String
  icon      String?
  color     String?
  order     Int
  userId    String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  labels    Label[]
  notes     Note[]
  user      User     @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([userId, order])
  @@index([userId])
}

model Label {
  id         String    @id @default(cuid())
  name       String
  color      String    @default("gray")
  notebookId String?
  userId     String?
  createdAt  DateTime  @default(now())
  updatedAt  DateTime  @updatedAt
  user       User?     @relation(fields: [userId], references: [id], onDelete: Cascade)
  notebook   Notebook? @relation(fields: [notebookId], references: [id], onDelete: Cascade)
  notes      Note[]    @relation("LabelToNote")

  @@unique([notebookId, name])
  @@index([notebookId])
  @@index([userId])
}

model Note {
  id                 String              @id @default(cuid())
  title              String?
  content            String
  color              String              @default("default")
  isPinned           Boolean             @default(false)
  isArchived         Boolean             @default(false)
  type               String              @default("text")
  checkItems         String?
  labels             String?
  images             String?
  links              String?
  reminder           DateTime?
  isReminderDone     Boolean             @default(false)
  reminderRecurrence String?
  reminderLocation   String?
  isMarkdown         Boolean             @default(false)
  size               String              @default("small")
  embedding          String?
  sharedWith         String?
  userId             String?
  order              Int                 @default(0)
  notebookId         String?
  createdAt          DateTime            @default(now())
  updatedAt          DateTime            @updatedAt
  contentUpdatedAt   DateTime            @default(now())
  autoGenerated      Boolean?
  aiProvider         String?
  aiConfidence       Int?
  language           String?
  languageConfidence Float?
  lastAiAnalysis     DateTime?
  aiFeedback         AiFeedback[]
  memoryEchoAsNote2  MemoryEchoInsight[] @relation("EchoNote2")
  memoryEchoAsNote1  MemoryEchoInsight[] @relation("EchoNote1")
  notebook           Notebook?           @relation(fields: [notebookId], references: [id])
  user               User?               @relation(fields: [userId], references: [id], onDelete: Cascade)
  shares             NoteShare[]
  labelRelations     Label[]             @relation("LabelToNote")

  @@index([isPinned])
  @@index([isArchived])
  @@index([order])
  @@index([reminder])
  @@index([userId])
  @@index([userId, notebookId])
}

model NoteShare {
  id          String    @id @default(cuid())
  noteId      String
  userId      String
  sharedBy    String
  status      String    @default("pending")
  permission  String    @default("view")
  notifiedAt  DateTime?
  respondedAt DateTime?
  createdAt   DateTime  @default(now())
  updatedAt   DateTime  @updatedAt
  sharer      User      @relation("SentShares", fields: [sharedBy], references: [id], onDelete: Cascade)
  user        User      @relation("ReceivedShares", fields: [userId], references: [id], onDelete: Cascade)
  note        Note      @relation(fields: [noteId], references: [id], onDelete: Cascade)

  @@unique([noteId, userId])
  @@index([userId])
  @@index([status])
  @@index([sharedBy])
}

model SystemConfig {
  key   String @id
  value String
}

model AiFeedback {
  id               String   @id @default(cuid())
  noteId           String
  userId           String?
  feedbackType     String
  feature          String
  originalContent  String
  correctedContent String?
  metadata         String?
  createdAt        DateTime @default(now())
  user             User?    @relation(fields: [userId], references: [id], onDelete: Cascade)
  note             Note     @relation(fields: [noteId], references: [id], onDelete: Cascade)

  @@index([noteId])
  @@index([userId])
  @@index([feature])
}

model MemoryEchoInsight {
  id              String   @id @default(cuid())
  userId          String?
  note1Id         String
  note2Id         String
  similarityScore Float
  insight         String
  insightDate     DateTime @default(now())
  viewed          Boolean  @default(false)
  feedback        String?
  dismissed       Boolean  @default(false)
  user            User?    @relation(fields: [userId], references: [id], onDelete: Cascade)
  note2           Note     @relation("EchoNote2", fields: [note2Id], references: [id], onDelete: Cascade)
  note1           Note     @relation("EchoNote1", fields: [note1Id], references: [id], onDelete: Cascade)

  @@unique([userId, insightDate])
  @@index([userId, insightDate])
  @@index([userId, dismissed])
}

model UserAISettings {
  userId                 String  @id
  titleSuggestions       Boolean @default(true)
  semanticSearch         Boolean @default(true)
  paragraphRefactor      Boolean @default(true)
  memoryEcho             Boolean @default(true)
  memoryEchoFrequency    String  @default("daily")
  aiProvider             String  @default("auto")
  preferredLanguage      String  @default("auto")
  fontSize               String  @default("medium")
  demoMode               Boolean @default(false)
  showRecentNotes        Boolean @default(false)
  emailNotifications      Boolean @default(false)
  desktopNotifications   Boolean @default(false)
  anonymousAnalytics      Boolean @default(false)
  user                   User    @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([memoryEcho])
  @@index([aiProvider])
  @@index([memoryEchoFrequency])
  @@index([preferredLanguage])
}
