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

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

model User {
  id     String  @id @default(cuid())
  avatar String?
  name   String

  email         String
  emailVerified Boolean
  image         String?
  createdAt     DateTime
  updatedAt     DateTime
  role          String?
  banned        Boolean?
  banReason     String?
  banExpires    DateTime?
  customerId    String?
  credits       Int       @default(0)
  sessions      Session[]
  accounts      Account[]
  passkeys      Passkey[]
  media         Media[]
  payments      Payment[]
  History       History[]

  @@unique([email])
  @@map("user")
}

model Session {
  id             String   @id
  expiresAt      DateTime
  token          String
  createdAt      DateTime
  updatedAt      DateTime
  ipAddress      String?
  userAgent      String?
  userId         String
  user           User     @relation(fields: [userId], references: [id], onDelete: Cascade)
  impersonatedBy String?

  @@unique([token])
  @@map("session")
}

model Account {
  id                    String    @id
  accountId             String
  providerId            String
  userId                String
  user                  User      @relation(fields: [userId], references: [id], onDelete: Cascade)
  accessToken           String?
  refreshToken          String?
  idToken               String?
  accessTokenExpiresAt  DateTime?
  refreshTokenExpiresAt DateTime?
  scope                 String?
  password              String?
  createdAt             DateTime
  updatedAt             DateTime

  @@map("account")
}

model Verification {
  id         String    @id
  identifier String
  value      String
  expiresAt  DateTime
  createdAt  DateTime?
  updatedAt  DateTime?

  @@map("verification")
}

model Passkey {
  id           String    @id
  name         String?
  publicKey    String
  userId       String
  user         User      @relation(fields: [userId], references: [id], onDelete: Cascade)
  credentialID String
  counter      Int
  deviceType   String
  backedUp     Boolean
  transports   String?
  createdAt    DateTime?

  @@map("passkey")
}

model Setting {
  id        String   @id @default(cuid())
  key       String   @unique
  value     Json
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  @@map("setting")
}

enum StorageType {
  s3
  local
}

model Media {
  id           String      @id @default(cuid())
  url          String      @unique
  key          String      @unique
  fileName     String
  size         Int
  mimeType     String
  storageType  StorageType
  libraryMedia Boolean     @default(false)
  userId       String?
  user         User?       @relation(fields: [userId], references: [id])
  createdAt    DateTime    @default(now())
  updatedAt    DateTime    @updatedAt

  @@map("media")
}

enum PlanStatus {
  active
  inactive
}

model Plan {
  id          String     @id @default(cuid())
  name        String
  description String
  price       Int
  credits     Int
  features    Json
  status      PlanStatus @default(inactive)
  isPopular   Boolean    @default(false)
  order       Int        @default(0)
  createdAt   DateTime   @default(now())
  updatedAt   DateTime   @updatedAt
}

enum PaymentStatus {
  paid
  unpaid
}

model Payment {
  id        String        @id @default(cuid())
  userId    String
  user      User          @relation(fields: [userId], references: [id], onDelete: Cascade)
  price     Int
  credits   Int
  status    PaymentStatus @default(unpaid)
  createdAt DateTime      @default(now())
  updatedAt DateTime      @updatedAt
}

enum PostStatus {
  draft
  published
}

model Post {
  id        String     @id @default(cuid())
  title     String
  slug      String     @unique
  excerpt   String?
  thumbnail String?
  content   String
  status    PostStatus @default(draft)
  createdAt DateTime   @default(now())
  updatedAt DateTime   @updatedAt
}

enum ContactStatus {
  unread
  read
  replied
}

model Contact {
  id        String        @id @default(cuid())
  name      String
  email     String
  subject   String
  message   String
  status    ContactStatus @default(unread)
  createdAt DateTime      @default(now())
  updatedAt DateTime      @updatedAt
}

model History {
  id        String   @id @default(cuid())
  userId    String?
  user      User?    @relation(fields: [userId], references: [id])
  inputUrl  String
  outputUrl String
  maskUrl   String?
  isFree    Boolean
  isDeleted Boolean  @default(false)
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}
