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

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

model User {
  id            String    @id @default(auto()) @map("_id") @db.ObjectId
  username      String
  email         String    @unique
  password      String
  status        String    // PENDING, VERIFIED
  personalName  String?
  phrase        String?   // 12-word verification phrase
  balance       Float     @default(0)
  isAdmin       Boolean   @default(false)
  createdAt     DateTime  @default(now())
  updatedAt     DateTime  @updatedAt

  // Relations
  plans         Plan[]
  verificationRequests VerificationRequest[]
  balanceHistory BalanceHistory[]
  withdrawalRequests WithdrawalRequest[]
}

model Plan {
  id        String   @id @default(auto()) @map("_id") @db.ObjectId
  userId    String   @db.ObjectId
  user      User     @relation(fields: [userId], references: [id])
  planType  String   // A, B, C
  amount    Float
  duration  Int      // in days
  status    String   // ACTIVE, COMPLETED, CANCELLED
  interest  Float    @default(0)
  startDate DateTime
  endDate   DateTime
  lastInterestCalculation DateTime @default(now())  // Track last interest calculation
  reinvestedFromPlan String?  @db.ObjectId  // Reference to original plan if reinvested
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model VerificationRequest {
  id        String   @id @default(auto()) @map("_id") @db.ObjectId
  userId    String   @db.ObjectId
  user      User     @relation(fields: [userId], references: [id])
  status    String   // PENDING, APPROVED, REJECTED
  adminNote String?  // Optional note from admin
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model BalanceHistory {
  id            String   @id @default(auto()) @map("_id") @db.ObjectId
  userId        String   @db.ObjectId
  user          User     @relation(fields: [userId], references: [id])
  amount        Float
  type          String   // TOP_UP, WITHDRAWAL, PLAN_INVESTMENT, PLAN_RETURN, INTEREST
  description   String?
  balanceBefore Float
  balanceAfter  Float
  createdAt     DateTime @default(now())
  referenceId   String?  @db.ObjectId  // Reference to Plan or WithdrawalRequest if applicable
}

model WithdrawalRequest {
  id            String   @id @default(auto()) @map("_id") @db.ObjectId
  userId        String   @db.ObjectId
  user          User     @relation(fields: [userId], references: [id])
  amount        Float
  status        String   // PENDING, APPROVED, REJECTED
  adminNote     String?  // Note from admin (especially if rejected)
  processedAt   DateTime?
  createdAt     DateTime @default(now())
  updatedAt     DateTime @updatedAt
}
