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

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

model User {
  id                       String                     @id @unique
  firstName                String?                    @default("")
  lastName                 String?                    @default("")
  email                    String                     @unique
  imageUrl                 String?                    @default("")
  imageName                String?                    @default("")
  customer_id              String?
  phone                    String?                    @default("")
  follower                 Int?
  role                     String?                    @default("")
  state                    String?                    @default("")
  city                     String?                    @default("")
  zipcode                  String?                    @default("")
  timezone                 String?                    @default("")
  rate                     String?                    @default("")
  countryOfResidence       String?                    @default("")
  biography                String?                    @default("")
  linkedInURL              String?                    @default("")
  instagramURL             String?                    @default("")
  youtubeURL               String?                    @default("")
  spotifyURL               String?                    @default("")
  tiktokURL                String?                    @default("")
  twitterURL               String?                    @default("")
  amazonURL                String?                    @default("")
  websiteURL1              String?                    @default("")
  websiteURL2              String?                    @default("")
  createdAt                DateTime                   @default(now())
  refresh_token            String?
  isExpert                 Boolean                    @default(false)
  videos                   String[]                   @default([])
  expertId                 String                     @default("")
  provider                 String?                    @default("")
  otherInfo                Json?
  is_invited               Int?                       @default(0) @db.SmallInt
  userName                 String?                    @default("")
  isBanned                 Boolean                    @default(false)
  isAdmin                  Boolean                    @default(false)
  isSubscribed             Boolean                    @default(false)
  countryOfResidenceISO    CountryCode                @default(UNK)
  countryOfResidenceId     Int?                       @default(1)
  dateOfBirth              DateTime?
  emailVerified            Boolean                    @default(false)
  idVerified               Boolean                    @default(false)
  Appointment              Appointment[]
  availabilities           Availability[]
  Chat                     Chat[]
  messages                 ChatMessage[]
  receivedClientReviews    ClientReview[]
  educations               Education[]
  experiences              Experience[]
  Expert                   Expert?
  writtenExpertReviews     ExpertReview[]
  expertises               Expertise[]
  key                      Key[]
  languagesSpoken          Language[]
  Questions                Question[]
  reply                    Reply[]
  admin_expert_application admin_expert_application[]
  admin_user               admin_user?
  email_verification_token email_verification_token[]
  expertApplicationAnswer  expertApplicationAnswer[]
  id_verification          id_verification[]
  session                  session[]
  FavoriteExpertIds        String[]
}

model Expert {
  id                   String         @id @unique @default(uuid())
  stripeAccountId      Int?
  rate                 String         @default("0")
  timezone             String         @default("")
  user_id              String         @unique
  isAccepted           Boolean        @default(false)
  countryOfResidenceId Int?
  created_at           DateTime?      @default(dbgenerated("(now() AT TIME ZONE 'utc'::text)")) @db.Timestamptz(6)
  firstName            String         @default("")
  lastName             String         @default("")
  email                String?        @default("")
  Appointment          Appointment[]
  Availabilities       Availability[]
  Chat                 Chat[]
  ChatMessage          ChatMessage[]
  ClientReview         ClientReview[]
  User                 User           @relation(fields: [user_id], references: [id])
  ExpertReview         ExpertReview[]
  StripeAccount        StripeAccount?
}

model id_verification {
  id              Int          @id @default(autoincrement())
  status          Status       @default(PENDING)
  userId          String
  idImageUrlBack  String?
  idImageUrlFront String
  createdAt       DateTime     @default(now())
  user            User         @relation(fields: [userId], references: [id])
  documentType    documentType @default(ID)
}

enum documentType {
  PASSPORT
  ID
  DRIVING_LICENSE
}

model email_verification_token {
  id      String @id
  expires BigInt
  userId  String
  user    User   @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model Question {
  id      Int    @id @default(autoincrement())
  content String
  userId  String
  user    User   @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model Reply {
  id              Int         @id @default(autoincrement())
  content         String
  appointmentKey  String
  questionContent String
  userId          String
  appointment     Appointment @relation(fields: [appointmentKey], references: [appointmentKey], onDelete: Cascade)
  user            User        @relation(fields: [userId], references: [id])
}

model StripeAccount {
  id         Int    @id @default(autoincrement())
  stripeData Json
  expertId   String @unique
  expert     Expert @relation(fields: [expertId], references: [id])
}

model Key {
  id              String  @id @unique
  hashed_password String?
  user_id         String
  user            User    @relation(fields: [user_id], references: [id], onDelete: Cascade)

  @@index([user_id])
}

model Experience {
  id          Int       @id @unique @default(autoincrement())
  companyName String
  role        String
  isCurrent   Boolean   @default(false)
  duration    String
  description String
  userId      String
  endDate     DateTime?
  startDate   DateTime?
  user        User      @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model Education {
  id              Int       @id @unique @default(autoincrement())
  institutionName String
  diplomaTitle    String
  fieldOfStudy    String
  isCurrent       Boolean   @default(false)
  duration        String
  userId          String
  startDate       DateTime?
  endDate         DateTime?
  user            User      @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model Expertise {
  id          Int       @id @unique @default(autoincrement())
  field       String
  isCurrent   Boolean   @default(false)
  description String
  duration    String
  userId      String
  startDate   DateTime?
  endDate     DateTime?
  user        User      @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model Language {
  id     Int    @id @unique @default(autoincrement())
  name   String @default("")
  userId String
  user   User   @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model Appointment {
  id                              Int           @id @default(autoincrement())
  clientId                        String
  clientEmail                     String        @default("")
  expertId                        String
  clientName                      String        @default("")
  expertName                      String        @default("")
  isAcceptedByExpert              String        @default("")
  price                           String
  timezone                        String
  date                            Int
  dayName                         String
  time                            String
  text                            String?
  createdAt                       DateTime      @default(now())
  videoRoomId                     String        @unique
  appointmentKey                  String        @unique
  paymentStatus                   String        @default("NotPaid")
  paymentIntentId                 String        @default("")
  sessionId                       String        @default("")
  authorizedDate                  String        @default("")
  appointementKeyInExpertTimeZone String
  appointementKeyInClientTimeZone String
  bookedAppointments              Json?
  status                          String
  reason                          String?
  client                          User          @relation(fields: [clientId], references: [id], onDelete: Cascade)
  expert                          Expert        @relation(fields: [expertId], references: [id], onDelete: Cascade)
  receivedClientReviews           ClientReview?
  writtenExpertReviews            ExpertReview?
  reply                           Reply[]
}

model Availability {
  id       Int     @id @default(autoincrement())
  day      String
  timezone String
  expertId String
  userId   String?
  expert   Expert  @relation(fields: [expertId], references: [id], onDelete: Cascade)
  user     User?   @relation(fields: [userId], references: [id], onDelete: Cascade)
  slots    Slot[]
}

model Slot {
  id             String       @id
  start          String
  end            String
  recurring      Boolean      @default(false)
  availabilityId Int
  hide           Boolean      @default(false)
  isSplit        Boolean      @default(false)
  originalId     String
  exceptions     Exception[]
  Availability   Availability @relation(fields: [availabilityId], references: [id], onDelete: Cascade)
}

model Exception {
  id     Int    @id @default(autoincrement())
  date   String
  slotId String
  Slot   Slot   @relation(fields: [slotId], references: [id], onDelete: Cascade)
}

model Chat {
  id        String        @id @unique
  createdAt DateTime      @default(now())
  updatedAt DateTime      @updatedAt
  clientId  String
  expertId  String
  client    User          @relation(fields: [clientId], references: [id], onDelete: Cascade)
  expert    Expert        @relation(fields: [expertId], references: [id], onDelete: Cascade)
  messages  ChatMessage[]
}

model ChatMessage {
  id        Int      @id @default(autoincrement())
  content   String
  userId    String
  fileName  String
  type      String
  fileType  String
  fileUrl   String   @default("")
  createdAt DateTime @default(now())
  chatId    String
  senderId  String
  expertId  String?
  chat      Chat     @relation(fields: [chatId], references: [id], onDelete: Cascade)
  Expert    Expert?  @relation(fields: [expertId], references: [id], onDelete: Cascade)
  sender    User     @relation(fields: [senderId], references: [id], onDelete: Cascade)
}

model ClientReview {
  id             Int         @id @default(autoincrement())
  reviewText     String
  createdAt      DateTime    @default(now())
  videoRoomId    String      @unique
  appointmentKey String      @unique
  isDisplayed    Boolean     @default(false)
  clientId       String
  expertId       String
  appointment    Appointment @relation(fields: [appointmentKey], references: [appointmentKey])
  client         User        @relation(fields: [clientId], references: [id])
  expert         Expert      @relation(fields: [expertId], references: [id])
}

model ExpertReview {
  id             Int         @id @default(autoincrement())
  reviewText     String?
  createdAt      DateTime    @default(now())
  videoRoomId    String      @unique
  expertId       String
  appointmentKey String      @unique
  isDisplayed    Boolean     @default(false)
  clientId       String
  appointment    Appointment @relation(fields: [appointmentKey], references: [appointmentKey])
  client         User        @relation(fields: [clientId], references: [id])
  expert         Expert      @relation(fields: [expertId], references: [id])
}

/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
model admin_coupon_code {
  id                 String    @id @unique
  amount_off         Int
  created_at         DateTime  @default(now())
  currency           String
  duration           String
  duration_in_months Int?
  livemode           Boolean
  max_redemptions    Int?
  metadata           Json      @default("{}")
  name               String?
  percent_off        Float?
  redeem_by          DateTime?
  times_redeemed     Int
  valid              Boolean

  @@ignore
}

model admin_invite_experts {
  id         String        @id(map: "invite_experts_pkey")
  firstName  String?       @default("")
  lastName   String?       @default("")
  created_at DateTime      @default(now()) @db.Timestamptz(6)
  email      String?
  status     INVITE_STATUS @default(PENDING)
}

/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments
model admin_mbc_cms {
  id                         BigInt   @id @default(autoincrement())
  created_at                 DateTime @default(now()) @db.Timestamptz(6)
  section1_text              String?
  section1_image             String?
  section2_text              String?
  section2_image             String?
  about_us_title             String?
  about_us_desc              String?
  general_condition_of_use   String?
  general_condition_of_sales String?
  is_active                  Int?     @default(1) @db.SmallInt
  invite_email_content       String?
  invite_email_subject       String?
}

/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments
model admin_mbc_faqs {
  id             BigInt   @id @default(autoincrement())
  created_at     DateTime @default(now()) @db.Timestamptz(6)
  question_title String?
  question_desc  String?
}

model admin_newsletter {
  id         BigInt   @id @default(autoincrement())
  created_at DateTime @default(now()) @db.Timestamptz(6)
  email      String?
  isUser     Boolean
  name       String?
}

/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
model admin_stripe {
  id                    BigInt   @default(autoincrement())
  created_at            DateTime @default(now()) @db.Timestamptz(6)
  stripe_percentage_cut String?

  @@ignore
}

model admin_user {
  id         String     @id @unique
  created_at DateTime   @default(now()) @db.Timestamptz(6)
  role       AdminRole?
  user_id    String     @unique
  User       User       @relation(fields: [user_id], references: [id])
}

model faqQuestion {
  id         Int      @id @default(autoincrement())
  question   String
  answer     String
  created_at DateTime @default(now()) @db.Timestamptz(6)
}

model session {
  id             String @id @unique
  user_id        String
  active_expires BigInt
  idle_expires   BigInt
  User           User   @relation(fields: [user_id], references: [id], onDelete: Cascade)

  @@index([user_id])
}

model admin_editing {
  id                        Int      @id @unique @default(1)
  updatedAt                 DateTime
  genericEmailBody          String?
  genericEmailHeader        String?
  aboutContent              String?
  aboutImageUrl             String?
  landingPageDesc           String?
  landingPageHeading        String?
  landingPageHero           String?
  landingPageSectionDesc    String?
  landingPageSectionHeading String?
  landingPageSectionHero    String?
  conditionsSale            String?
  conditionsUse             String?
  privacyPolicy             String?
}

model admin_notification {
  id          Int      @id @unique @default(autoincrement())
  created_at  DateTime @default(now()) @db.Timestamptz(6)
  title       String
  link        String?
  description String
}

model admin_notification_status {
  id                    Int                @id @unique @default(1)
  status                NotificationStatus @default(NOTSEEN)
  newExpertApplication  NotificationStatus @default(NOTSEEN)
  newInvitationAccepted NotificationStatus @default(NOTSEEN)
  newIdVerification     NotificationStatus @default(NOTSEEN)
}

model expertApplicationAnswer {
  id                         String                    @id @unique @default(uuid())
  answer                     String
  created_at                 DateTime                  @default(now()) @db.Timestamptz(6)
  userId                     String
  questionId                 String
  admin_expert_applicationId String?
  admin_expert_application   admin_expert_application? @relation(fields: [admin_expert_applicationId], references: [id])
  expertApplicationQuestion  expertApplicationQuestion @relation(fields: [questionId], references: [id])
  User                       User                      @relation(fields: [userId], references: [id])
}

model admin_expert_application {
  id        String                    @id(map: "expert_application_pkey") @default(uuid())
  status    Status                    @default(PENDING)
  createdAt DateTime                  @default(now())
  userId    String
  User      User                      @relation(fields: [userId], references: [id])
  answer    expertApplicationAnswer[]
}

model expertApplicationQuestion {
  id                      String                    @id @unique
  question                String
  created_at              DateTime                  @default(now()) @db.Timestamptz(6)
  order                   Int                       @default(autoincrement())
  expertApplicationAnswer expertApplicationAnswer[]
}

enum AdminRole {
  SUPER_ADMIN
  ADMIN
  CUSTOMER_SERVICE
  EDITOR
  MARKETING
  NULL
}

enum Status {
  PENDING
  REJECTED
  ACCEPTED
}

enum CountryCode {
  UNK
  AD
  AE
  AF
  AG
  AI
  AL
  AM
  AN
  AO
  AQ
  AR
  AS
  AT
  AU
  AW
  AX
  AZ
  BA
  BB
  BD
  BE
  BF
  BG
  BH
  BI
  BJ
  BL
  BM
  BN
  BO
  BQ
  BR
  BS
  BT
  BV
  BW
  BY
  BZ
  CA
  CC
  CD
  CF
  CG
  CH
  CI
  CK
  CL
  CM
  CN
  CO
  CR
  CU
  CV
  CW
  CX
  CY
  CZ
  DE
  DJ
  DK
  DM
  DO
  DZ
  EC
  EE
  EG
  EH
  ER
  ES
  ET
  EU
  FI
  FJ
  FK
  FM
  FO
  FR
  GA
  GB_ENG
  GB_NIR
  GB_SCT
  GB_WLS
  GB
  GD
  GE
  GF
  GG
  GH
  GI
  GL
  GM
  GN
  GP
  GQ
  GR
  GS
  GT
  GU
  GW
  GY
  HK
  HM
  HN
  HR
  HT
  HU
  ID
  IE
  IL
  IM
  IN
  IO
  IQ
  IR
  IS
  IT
  JE
  JM
  JO
  JP
  KE
  KG
  KH
  KI
  KM
  KN
  KP
  KR
  KW
  KY
  KZ
  LA
  LB
  LC
  LI
  LK
  LR
  LS
  LT
  LU
  LV
  LY
  MA
  MC
  MD
  ME
  MF
  MG
  MH
  MK
  ML
  MM
  MN
  MO
  MP
  MQ
  MR
  MS
  MT
  MU
  MV
  MW
  MX
  MY
  MZ
  NA
  NC
  NE
  NF
  NG
  NI
  NL
  NO
  NP
  NR
  NU
  NZ
  OM
  PA
  PE
  PF
  PG
  PH
  PK
  PL
  PM
  PN
  PR
  PS
  PT
  PW
  PY
  QA
  RE
  RO
  RS
  RU
  RW
  SA
  SB
  SC
  SD
  SE
  SG
  SH
  SI
  SJ
  SK
  SL
  SM
  SN
  SO
  SR
  SS
  ST
  SV
  SX
  SY
  SZ
  TC
  TD
  TF
  TG
  TH
  TJ
  TK
  TL
  TM
  TN
  TO
  TR
  TT
  TV
  TW
  TZ
  UA
  UG
  UM
  US
  UY
  UZ
  VA
  VC
  VE
  VG
  VI
  VN
  VU
  WF
  XK
  WS
  YE
  YT
  ZA
  ZM
  ZW
}

enum NotificationStatus {
  SEEN
  NOTSEEN
}

enum INVITE_STATUS {
  PENDING
  REJECTED
  ACCEPTED
  CREATED
}
