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

datasource db {
  provider = "postgresql"
}

model Order {
  id            String      @id @default(cuid())
  userId        Int         @map("user_id")
  userEmail     String?     @map("user_email")
  userName      String?     @map("user_name")
  userNotes     String?     @map("user_notes")
  amount        Decimal     @db.Decimal(10, 2)
  payAmount     Decimal?    @db.Decimal(10, 2) @map("pay_amount")
  feeRate       Decimal?    @db.Decimal(5, 4)  @map("fee_rate")
  rechargeCode  String      @unique @map("recharge_code")
  status        OrderStatus @default(PENDING)
  paymentType   String      @map("payment_type")

  paymentTradeNo String?    @map("payment_trade_no")
  payUrl        String?     @map("pay_url")
  qrCode        String?     @map("qr_code")
  qrCodeImg     String?     @map("qr_code_img")

  refundAmount  Decimal?    @db.Decimal(10, 2) @map("refund_amount")
  refundReason  String?     @map("refund_reason")
  refundAt      DateTime?   @map("refund_at")
  forceRefund   Boolean     @default(false) @map("force_refund")

  expiresAt     DateTime    @map("expires_at")
  paidAt        DateTime?   @map("paid_at")
  completedAt   DateTime?   @map("completed_at")
  failedAt      DateTime?   @map("failed_at")
  failedReason  String?     @map("failed_reason")
  createdAt     DateTime    @default(now()) @map("created_at")
  updatedAt     DateTime    @updatedAt @map("updated_at")
  clientIp      String?     @map("client_ip")
  srcHost       String?     @map("src_host")
  srcUrl        String?     @map("src_url")

  // ── 订单类型 & 订阅相关 ──
  orderType           String             @default("balance") @map("order_type")
  planId              String?            @map("plan_id")
  plan                SubscriptionPlan?  @relation(fields: [planId], references: [id])
  subscriptionGroupId Int?               @map("subscription_group_id")
  subscriptionDays    Int?               @map("subscription_days")

  auditLogs     AuditLog[]

  @@index([userId])
  @@index([status])
  @@index([expiresAt])
  @@index([createdAt])
  @@index([paidAt])
  @@index([paymentType, paidAt])
  @@index([orderType])
  @@map("orders")
}

enum OrderStatus {
  PENDING
  PAID
  RECHARGING
  COMPLETED
  EXPIRED
  CANCELLED
  FAILED
  REFUNDING
  REFUNDED
  REFUND_FAILED
}

model AuditLog {
  id        String   @id @default(cuid())
  orderId   String   @map("order_id")
  order     Order    @relation(fields: [orderId], references: [id])
  action    String
  detail    String?  @db.Text
  operator  String?
  createdAt DateTime @default(now()) @map("created_at")

  @@index([orderId])
  @@index([createdAt])
  @@map("audit_logs")
}

// ── 渠道展示配置 ──
model Channel {
  id             String   @id @default(cuid())
  groupId        Int      @unique @map("group_id")
  name           String
  platform       String   @default("claude")
  rateMultiplier Decimal  @db.Decimal(10, 4) @map("rate_multiplier")
  description    String?  @db.Text
  models         String?  @db.Text
  features       String?  @db.Text
  sortOrder      Int      @default(0) @map("sort_order")
  enabled        Boolean  @default(true)
  createdAt      DateTime @default(now()) @map("created_at")
  updatedAt      DateTime @updatedAt @map("updated_at")

  @@index([sortOrder])
  @@map("channels")
}

// ── 订阅套餐配置 ──
model SubscriptionPlan {
  id            String   @id @default(cuid())
  groupId       Int      @unique @map("group_id")
  name          String
  description   String?  @db.Text
  price         Decimal  @db.Decimal(10, 2)
  originalPrice Decimal? @db.Decimal(10, 2) @map("original_price")
  validityDays  Int      @default(30) @map("validity_days")
  validityUnit  String   @default("day") @map("validity_unit") // day | week | month
  features      String?  @db.Text
  forSale       Boolean  @default(false) @map("for_sale")
  sortOrder     Int      @default(0) @map("sort_order")
  createdAt     DateTime @default(now()) @map("created_at")
  updatedAt     DateTime @updatedAt @map("updated_at")

  orders        Order[]

  @@index([forSale, sortOrder])
  @@map("subscription_plans")
}

// ── 系统配置 ──
model SystemConfig {
  key       String   @id
  value     String   @db.Text
  group     String   @default("general")
  label     String?
  updatedAt DateTime @updatedAt @map("updated_at")

  @@index([group])
  @@map("system_configs")
}
