generator client {
  provider = "prisma-client-js"
}

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

model User {
  id                       String                @id @default(cuid())
  email                    String                @unique
  passwordHash             String?
  name                     String?
  image                    String?
  emailVerified            DateTime?
  verifiedAt               DateTime?
  emailVerificationToken   String?
  emailVerificationExpires DateTime?
  passwordResetToken       String?
  passwordResetExpires     DateTime?
  createdAt                DateTime              @default(now())
  updatedAt                DateTime              @updatedAt
  timezone                 String                @default("UTC")
  autoRolling              Boolean               @default(false)
  protectEventTimes        Boolean               @default(false)
  language                 String                @default("de")
  dateFormat               String                @default("yyyy-MM-dd")
  timeFormat               String                @default("24h")
  startHour                Int                   @default(8)
  endHour                  Int                   @default(18)
  showNextTask             Boolean               @default(false)
  calendarEditMode         Boolean               @default(false)
  focusTimerDuration       Int                   @default(25)
  focusBreakDuration       Int                   @default(5)
  showTimeGrid             Boolean               @default(true)
  showSomeday              Boolean               @default(true)
  showAllDayEvents         Boolean               @default(true)
  showSchedule             Boolean               @default(true)
  cellDuration             Int                   @default(30)
  viewStyle                String                @default("simple")
  viewDays                 Int                   @default(7)
  fontSize                 String                @default("M")
  goalFallbackType         String                @default("quote")
  goalDefaultSentence      String                @default("goal of the week")
  goalFontFamily           String?               @default("Lato")
  goalFontSize             String?               @default("1rem")
  goalFontWeight           String?               @default("500")
  headlineFont             String                @default("Oswald")
  headlineFontSize         String?               @default("1.5rem")
  headlineFontWeight       String?               @default("900")
  dateFontFamily           String?               @default("Inter")
  dateFontSize             String?               @default("0.65rem")
  dateFontWeight           String?               @default("400")
  timeTaskFontFamily       String?               @default("Inter")
  timeTaskFontSize         String?               @default("0.75rem")
  timeTaskFontWeight       String?               @default("500")
  bodyFont                 String                @default("Inter")
  taskFontFamily           String?               @default("Inter")
  taskFontSize             String?               @default("0.9rem")
  taskFontWeight           String?               @default("400")
  eventFontFamily          String?               @default("Inter")
  eventFontSize            String?               @default("0.85rem")
  eventFontWeight          String?               @default("400")
  lightTheme               Json?
  darkTheme                Json?
  fontWeight               String                @default("400")
  weekdayColor             String?               @default("#0ea5e9")
  dateColor                String?               @default("#888888")
  taskColor                String?               @default("#333333")
  todayHighlightColor      String?               @default("#f0fafa")
  weekendColorSat          String?               @default("#ffc107")
  weekendColorSun          String?               @default("#dc2626")
  pastDayColor             String?               @default("#a6a6a7")
  goalScope                String                @default("week")
  dateLayout               String                @default("right")
  mobileDateLayout         String                @default("below")
  dateAlignment            String                @default("center")
  dateVerticalAlign        String?               @default("middle")
  headerDisplay            String?               @default("kw")
  headerCustomFormat     String?               @default("KW WW | YYYY")
  hourLabelFormat          String                @default("short")
  showSubHourSlots         Boolean               @default(true)
  allDayPosition           String                @default("above")
  cwColor                  String?               @default("#333333")
  cwFontFamily             String?               @default("Oswald")
  cwFontSize               String?               @default("1.5rem")
  cwFontWeight             String?               @default("700")
  yearColor                String?               @default("#333333")
  yearFontFamily           String?               @default("Oswald")
  yearFontSize             String?               @default("1.5rem")
  yearFontWeight           String?               @default("700")
  showTaskCheckboxes       Boolean               @default(false)
  emailVerificationCode    String?
  dayHeaderGap             String?               @default("0.75em")
  accountNumber            Int                   @unique @default(autoincrement())
  showCompletedTasks       Boolean               @default(true)
  showLines                Boolean               @default(true)
  weekdayFormat            String?               @default("long")
  weekdayCase              String?               @default("capitalize")
  customWeekdayNames       String?               @default("")
  startDayOffset           Int                   @default(-1)
  quoteSourceUrls          String[]              @default([])
  quoteLanguages           String[]              @default(["en", "de"])
  kanbanStages             String?
  accounts                 Account[]
  cachedCalendarEvents     CachedCalendarEvent[]
  calendarConnections      CalendarConnection[]
  projects                 Project[]
  sessions                 Session[]
  somedayLists             SomedayList[]
  tasks                    Task[]
  weeklyGoals              WeeklyGoal[]
}

model Account {
  id                String  @id @default(cuid())
  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?
  ext_expires_in    Int?
  user              User    @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@unique([provider, providerAccountId])
}

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

model VerificationToken {
  identifier String
  token      String   @unique
  expires    DateTime

  @@unique([identifier, token])
}

model Task {
  id                 String       @id @default(cuid())
  userId             String
  title              String
  description        String?
  markdownContent    String?
  completed          Boolean      @default(false)
  isRolling          Boolean      @default(false)
  order              Int          @default(0)
  dayOfWeek          Int?
  scheduledDate      DateTime?
  somedayListId      String?
  originalDate       DateTime?
  startTime          String?
  endTime            String?
  isRecurring        Boolean      @default(false)
  recurrenceInterval Int?
  recurrenceUnit     String?
  recurrenceTime     String?
  recurrenceEndDate  DateTime?
  recurrenceDays     String?
  createdAt          DateTime     @default(now())
  updatedAt          DateTime     @updatedAt
  externalId         String?
  externalProvider   String?
  externalListId     String?
  lastSyncedAt       DateTime?
  deletedAt          DateTime?
  parentTaskId       String?
  somedaySlotIndex   Int?
  projectId          String?
  kanbanStage        String?
  parent             Task?        @relation("SubTasks", fields: [parentTaskId], references: [id], onDelete: Cascade)
  subTasks           Task[]       @relation("SubTasks")
  project            Project?     @relation(fields: [projectId], references: [id])
  somedayList        SomedayList? @relation(fields: [somedayListId], references: [id])
  user               User         @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([userId, dayOfWeek])
  @@index([userId, scheduledDate])
  @@index([userId, somedayListId])
  @@index([userId, externalId])
  @@index([userId, deletedAt])
  @@index([userId, projectId])
  @@index([parentTaskId])
}

model SomedayList {
  id               String    @id @default(cuid())
  userId           String
  title            String
  order            Int       @default(0)
  tab              String?
  createdAt        DateTime  @default(now())
  updatedAt        DateTime  @updatedAt
  externalId       String?
  externalProvider String?
  lastSyncedAt     DateTime?
  user             User      @relation(fields: [userId], references: [id], onDelete: Cascade)
  tasks            Task[]

  @@index([userId])
}

model CalendarConnection {
  id           String                @id @default(cuid())
  userId       String
  provider     String
  accessToken  String
  refreshToken String?
  expiresAt    DateTime?
  calendars    Json?
  createdAt    DateTime              @default(now())
  updatedAt    DateTime              @updatedAt
  cachedEvents CachedCalendarEvent[]
  user         User                  @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model CachedCalendarEvent {
  id               String             @id @default(cuid())
  userId           String
  externalId       String
  connectionId     String
  provider         String
  calendarId       String
  calendarTitle    String
  calendarColor    String?
  title            String
  description      String?
  location         String?
  startDateTime    DateTime?
  startDate        String?
  endDateTime      DateTime?
  endDate          String?
  weekStart        DateTime
  syncedAt         DateTime           @default(now())
  createdAt        DateTime           @default(now())
  updatedAt        DateTime           @updatedAt
  url              String?
  recurringEventId String?
  isRecurring      Boolean            @default(false)
  connection       CalendarConnection @relation(fields: [connectionId], references: [id], onDelete: Cascade)
  user             User               @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@unique([userId, externalId, provider])
  @@index([userId, startDateTime])
  @@index([userId, startDate])
  @@index([connectionId, weekStart])
}

model WeeklyGoal {
  id        String   @id @default(cuid())
  userId    String
  weekStart DateTime
  text      String   @default("your goal of this week")
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  user      User     @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@unique([userId, weekStart])
  @@index([userId])
}

model Project {
  id          String   @id @default(cuid())
  userId      String
  name        String
  icon        String?
  color       String?
  description String?
  order       Int      @default(0)
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt
  user        User     @relation(fields: [userId], references: [id], onDelete: Cascade)
  tasks       Task[]

  @@index([userId])
}
