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

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

model User {
    id            String    @id @default(uuid())
    pubkey        String?   @unique
    privkey       String?
    name          String?
    email         String?   @unique
    emailVerified DateTime?
    image         String?
    username      String?   @unique
    avatar        String?
    purchased     Purchase[]
    courses       Course[]
    resources     Resource[]
    courseDrafts  CourseDraft[]
    drafts        Draft[]
    role          Role?
    accounts      Account[]
    sessions      Session[]
    createdAt     DateTime  @default(now())
    updatedAt     DateTime  @updatedAt
    userLessons UserLesson[]
    userCourses UserCourse[]
}

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 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?
    oauth_token_secret String?
    oauth_token        String?

    user User @relation(fields: [userId], references: [id], onDelete: Cascade)

    @@unique([provider, providerAccountId])
}

model Role {
    id           String    @id @default(uuid())
    user         User      @relation(fields: [userId], references: [id])
    userId       String    @unique
    subscribed           Boolean   @default(false)
    admin                Boolean   @default(false)
    subscriptionStartDate DateTime?
    lastPaymentAt         DateTime?
    subscriptionExpiredAt DateTime?
    nwc                String?
}

model Resource {
    id        String     @id // Client generates UUID
    userId    String
    user      User       @relation(fields: [userId], references: [id])
    lessons   Lesson[]
    draftLessons DraftLesson[]
    price     Int        @default(0)
    purchases Purchase[]
    noteId    String?    @unique
    videoId   String?
    createdAt DateTime   @default(now())
    updatedAt DateTime   @updatedAt
}


model Draft {
    id              String        @id @default(uuid())
    userId          String
    user            User          @relation(fields: [userId], references: [id])
    type            String
    title           String
    summary         String
    content         String
    image           String?
    price           Int?          @default(0)
    topics          String[]
    additionalLinks String[]
    createdAt       DateTime      @default(now())
    updatedAt       DateTime      @updatedAt
    draftLessons    DraftLesson[]
    lessons         Lesson[]
}

model Course {
    id        String     @id
    userId    String
    user      User       @relation(fields: [userId], references: [id])
    price     Int        @default(0)
    lessons   Lesson[]
    purchases Purchase[]
    noteId    String?    @unique
    createdAt DateTime   @default(now())
    updatedAt DateTime   @updatedAt
    userCourses UserCourse[]
}

model CourseDraft {
    id           String        @id @default(uuid())
    userId       String
    user         User          @relation(fields: [userId], references: [id])
    draftLessons DraftLesson[]
    title        String
    summary      String
    image        String?
    price        Int?          @default(0)
    topics       String[]
    createdAt    DateTime      @default(now())
    updatedAt    DateTime      @updatedAt
}

model Lesson {
    id         String   @id @default(uuid())
    courseId   String?
    course     Course?  @relation(fields: [courseId], references: [id])
    resourceId String?
    resource   Resource? @relation(fields: [resourceId], references: [id])
    draftId    String?
    draft      Draft?   @relation(fields: [draftId], references: [id])
    index      Int
    createdAt  DateTime @default(now())
    updatedAt  DateTime @updatedAt
    userLessons UserLesson[]
}

model DraftLesson {
    id            String      @id @default(uuid())
    courseDraftId String
    courseDraft   CourseDraft @relation(fields: [courseDraftId], references: [id])
    resourceId    String?
    resource      Resource?   @relation(fields: [resourceId], references: [id])
    draftId       String?
    draft         Draft?      @relation(fields: [draftId], references: [id])
    index         Int
    createdAt     DateTime    @default(now())
    updatedAt     DateTime    @updatedAt
}

model UserLesson {
    id         String   @id @default(uuid())
    userId     String
    user       User     @relation(fields: [userId], references: [id])
    lessonId   String
    lesson     Lesson   @relation(fields: [lessonId], references: [id])
    opened     Boolean  @default(false)
    completed  Boolean  @default(false)
    openedAt   DateTime?
    completedAt DateTime?
    createdAt  DateTime @default(now())
    updatedAt  DateTime @updatedAt

    @@unique([userId, lessonId])
}

model Purchase {
    id         String   @id @default(uuid())
    userId     String
    courseId   String?
    resourceId String?
    amountPaid Int
    createdAt  DateTime @default(now())
    updatedAt  DateTime @updatedAt
    user       User     @relation(fields: [userId], references: [id])
    course     Course?  @relation(fields: [courseId], references: [id])
    resource   Resource? @relation(fields: [resourceId], references: [id])

    @@unique([userId, courseId])
}

model UserCourse {
    id         String   @id @default(uuid())
    userId     String
    user       User     @relation(fields: [userId], references: [id])
    courseId   String
    course     Course   @relation(fields: [courseId], references: [id])
    started    Boolean  @default(false)
    completed  Boolean  @default(false)
    startedAt  DateTime?
    completedAt DateTime?
    createdAt  DateTime @default(now())
    updatedAt  DateTime @updatedAt

    @@unique([userId, courseId])
}