// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

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

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

enum Role {
  USER
  ADMIN
}

enum KycStatus {
  PENDING
  VERIFIED
  REJECTED
}

enum TransactionType {
  BUY
  SELL
  SWAP
}

enum TransactionStatus {
  PENDING
  COMPLETED
  FAILED
}

enum AlertCondition {
  ABOVE
  BELOW
}

enum AlertStatus {
  ACTIVE
  TRIGGERED
  INACTIVE
}

enum DepositStatus {
  PENDING
  CONFIRMED
  FAILED
}

enum WithdrawalStatus {
  PENDING
  APPROVED
  REJECTED
  PROCESSING
  COMPLETED
}

enum BrokerStatus {
  ACTIVE
  SUSPENDED
  PENDING
}

enum ProfileStatus {
  PENDING
  ACTIVE
  INACTIVE
}

enum NotificationType {
  INFO
  SUCCESS
  WARNING
  ERROR
}

enum TicketStatus {
  OPEN
  IN_PROGRESS
  RESOLVED
  CLOSED
}

enum TicketPriority {
  LOW
  MEDIUM
  HIGH
  URGENT
}

enum KycDocumentType {
  GOVERNMENT_ID
  PROOF_OF_ADDRESS
  SELFIE
}

enum KycDocumentStatus {
  PENDING
  VERIFIED
  REJECTED
}

model User {
  id            String    @id @default(cuid())
  name          String
  email         String    @unique
  password      String
  role          Role      @default(USER)
  avatar        String?
  phone         String?
  country       String?
  address       String?
  city          String?
  zip           String?
  dateOfBirth   DateTime?
  kycStatus     KycStatus @default(PENDING)
  referralCode  String    @unique @default(cuid())
  referredBy       String?
  twoFactorEnabled Boolean   @default(false)
  twoFactorSecret  String?
  emailAlerts      Boolean   @default(true)
  withdrawPin      Boolean   @default(false)
  withdrawPinCode  String?
  createdAt        DateTime  @default(now())
  updatedAt        DateTime  @updatedAt

  sessions      Session[]
  transactions  Transaction[]
  portfolio     Portfolio[]
  watchlist     Watchlist[]
  alerts        Alert[]
  deposits      Deposit[]
  withdrawals   Withdrawal[]
  slots         Slot[]
  profiles      Profile[]
  notifications Notification[]
  tickets       SupportTicket[]
  kycDocuments  KycDocument[]

  @@map("users")
}

model Session {
  id        String   @id @default(uuid())
  userId    String
  token     String   @unique @db.VarChar(500)
  expiresAt DateTime
  device    String?
  ip        String?
  createdAt DateTime @default(now())

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

  @@map("sessions")
}

model Transaction {
  id        String            @id @default(cuid())
  userId    String
  type      TransactionType
  assetSym  String
  amount    Decimal           @db.Decimal(20, 8)
  price     Decimal           @db.Decimal(20, 8)
  value     Decimal           @db.Decimal(20, 8)
  status    TransactionStatus @default(PENDING)
  createdAt DateTime          @default(now())

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

  @@map("transactions")
}

model Portfolio {
  id           String   @id @default(cuid())
  userId       String
  assetSym     String
  balance      Decimal  @db.Decimal(20, 8)
  avgBuyPrice  Decimal  @db.Decimal(20, 8)
  updatedAt    DateTime @updatedAt

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

  @@unique([userId, assetSym])
  @@map("portfolios")
}

model Watchlist {
  id        String   @id @default(cuid())
  userId    String
  assetSym  String
  createdAt DateTime @default(now())

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

  @@unique([userId, assetSym])
  @@map("watchlists")
}

model Alert {
  id           String         @id @default(cuid())
  userId       String
  assetSym     String
  condition    AlertCondition
  targetPrice  Decimal        @db.Decimal(20, 8)
  currentPrice Decimal        @db.Decimal(20, 8)
  status       AlertStatus    @default(ACTIVE)
  createdAt    DateTime       @default(now())

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

  @@map("alerts")
}

model Deposit {
  id            String        @id @default(cuid())
  userId        String
  assetSym      String
  network       String
  method        String        @default("Crypto")
  walletAddress String?
  proofUrl      String?
  amount        Decimal       @db.Decimal(20, 8)
  price         Decimal?      @db.Decimal(20, 8)
  value         Decimal?      @db.Decimal(20, 8)
  status        DepositStatus @default(PENDING)
  txHash        String?
  rejectReason  String?
  reviewedBy    String?
  reviewedAt    DateTime?
  createdAt     DateTime      @default(now())

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

  @@map("deposits")
}

model Withdrawal {
  id        String           @id @default(cuid())
  userId    String
  assetSym  String
  network   String
  toAddress String
  amount    Decimal          @db.Decimal(20, 8)
  fee       Decimal          @db.Decimal(20, 8)
  status    WithdrawalStatus @default(PENDING)
  createdAt DateTime         @default(now())

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

  @@map("withdrawals")
}

model Broker {
  id          String       @id @default(cuid())
  name        String
  email       String       @unique
  avatar      String?
  commission  Decimal      @db.Decimal(5, 2)
  status      BrokerStatus @default(PENDING)
  rating      Decimal      @db.Decimal(3, 2) @default(0)
  trades      Int          @default(0)
  totalProfit Decimal      @db.Decimal(20, 8) @default(0)
  totalVolume Decimal      @db.Decimal(20, 8) @default(0)
  joined      DateTime     @default(now())
  createdAt   DateTime     @default(now())

  slots Slot[]

  @@map("brokers")
}

model Slot {
  id        String   @id @default(cuid())
  adminId   String
  brokerId  String
  num       Int
  active    Boolean  @default(false)
  balance   Decimal  @db.Decimal(20, 8) @default(0)
  generated Decimal  @db.Decimal(20, 8) @default(0)
  pct       Decimal  @db.Decimal(5, 2) @default(0)
  userId    String?
  createdAt DateTime @default(now())

  admin    User    @relation(fields: [adminId], references: [id], onDelete: Cascade)
  broker   Broker  @relation(fields: [brokerId], references: [id], onDelete: Cascade)
  profiles Profile[]
  transactions SlotTransaction[]

  @@map("slots")
}

model Profile {
  id               String        @id @default(cuid())
  slotId           String
  userId           String
  fullName         String
  email            String
  phone            String?
  address          String?
  zip              String?
  country          String?
  brokerName       String
  brokerFee        Decimal       @db.Decimal(5, 2)
  walletAddress    String?
  status           ProfileStatus @default(PENDING)
  activationAmount Decimal       @db.Decimal(20, 8)
  submittedAt      DateTime      @default(now())
  activatedAt      DateTime?

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

  @@map("profiles")
}

model Notification {
  id        String           @id @default(cuid())
  userId    String
  title     String
  message   String           @db.Text
  type      NotificationType @default(INFO)
  read      Boolean          @default(false)
  createdAt DateTime         @default(now())

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

  @@map("notifications")
}

model SupportTicket {
  id        String         @id @default(cuid())
  userId    String
  subject   String
  status    TicketStatus   @default(OPEN)
  priority  TicketPriority @default(MEDIUM)
  messages  Json
  createdAt DateTime       @default(now())
  updatedAt DateTime       @updatedAt

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

  @@map("support_tickets")
}

model KycDocument {
  id        String            @id @default(cuid())
  userId    String
  type      KycDocumentType
  fileUrl   String
  status    KycDocumentStatus @default(PENDING)
  createdAt DateTime          @default(now())

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

  @@map("kyc_documents")
}

model PlatformSetting {
  id        String   @id @default(cuid())
  key       String   @unique
  value     String   @db.Text
  updatedAt DateTime @updatedAt

  @@map("platform_settings")
}

model SlotTransaction {
  id          String   @id @default(cuid())
  slotId      String
  type        String   // "DEPOSIT", "BONUS", "PROFIT", "WITHDRAWAL"
  desc        String
  sub         String?
  amount      Decimal  @db.Decimal(20, 8)
  balance     Decimal  @db.Decimal(20, 8)
  createdAt   DateTime @default(now())

  slot Slot @relation(fields: [slotId], references: [id], onDelete: Cascade)

  @@map("slot_transactions")
}
