enum UserRole {
  BANNED
  FROZEN
  OBSERVER
  CUSTOMER
  AGENT
  USER
  POWERUSER
  EDITOR
  ADMIN
  MODERATOR
  SUPERVISOR
}

model User {
  id            Int                    @id @default(autoincrement())
  locale        Lang                   @default(uk)
  active        Boolean?
  name          String?
  username      String?                @unique
  email         String?                @unique
  emailVerified DateTime?              @map("email_verified") @db.Timestamp(3)
  password      String?                @db.VarChar(384)
  image         String?
  // sessions      Session[]
  /// [UserExtendedDataType]
  extendedData  Json?                  @map("extended_data") @db.Json
  // orders        Order[]
  favorites     UserFavouriteProduct[]
  reviews       UserProductReview[]
  createdAt     DateTime               @default(now()) @map("created_at") @db.Timestamp(3)
  updatedAt     DateTime?              @default(dbgenerated("NULL DEFAULT NULL ON UPDATE current_timestamp(3)")) @map("updated_at") @db.Timestamp(3)
  account       Account[]
  //authenticator Authenticator[]
  //session       Session[]

  @@map("users")
}

// https://stackoverflow.com/questions/72606917/get-custom-attribute-depend-on-pivot-table-in-nest-js-with-prisma-orm
model UserFavouriteProduct {
  id                 Int      @id @default(autoincrement())
  status             Boolean?
  informAvailability Boolean? @map("inform_availability")
  user               User     @relation(fields: [userId], references: [id])
  userId             Int      @map("user_id")
  productId          Int      @map("product_id")
  createdAt          DateTime @default(now()) @map("created_at") @db.Timestamp(3)

  @@unique([userId, productId])
  @@map("user_favourite_products")
}

// https://stackoverflow.com/questions/67065859/modeling-a-rating-system-in-prisma
model UserProductReview {
  id     Int      @id @default(autoincrement())
  rating Decimal?
  body   String   @db.Text

  productId Int       @map("product_id")
  user      User      @relation(fields: [userId], references: [id])
  userId    Int       @map("user_id")
  createdAt DateTime  @default(now()) @map("created_at") @db.Timestamp(3)
  updatedAt DateTime? @default(dbgenerated("NULL DEFAULT NULL ON UPDATE current_timestamp(3)")) @map("updated_at") @db.Timestamp(3)

  @@unique([userId, productId])
  @@map("user_product_reviews")
}

model Account {
  id                       Int      @id @default(autoincrement())
  userId                   Int      @unique @map("user_id")
  role                     UserRole @default(CUSTOMER)
  active                   Boolean  @default(true)
  addess                   String?
  type                     String
  provider                 String
  providerAccountId        String   @map("provider_account_id")
  refresh_token            String?  @db.Text
  access_token             String?  @db.Text
  expires_at               Int?
  token_type               String?
  scope                    String?
  id_token                 String?  @db.Text
  session_state            String?
  refresh_token_expires_in Int?
  user                     User     @relation(fields: [userId], references: [id])

  @@unique([provider, providerAccountId])
  @@index([userId])
  @@map("accounts")
}
