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

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

// ==================== 交易配置 ====================

// 交易全局配置
model TradingConfig {
  id                    String    @id @default(uuid())
  // 总积分股数量: 100.02亿 (100亿 + 200万 = 10002000000)
  totalShares           Decimal   @default(10002000000) @map("total_shares") @db.Decimal(30, 8)
  // 目标销毁量: 100亿 (4年销毁完)
  burnTarget            Decimal   @default(10000000000) @map("burn_target") @db.Decimal(30, 8)
  // 销毁周期: 4年 (分钟数) 365*4*1440 = 2102400
  burnPeriodMinutes     Int       @default(2102400) @map("burn_period_minutes")
  // 每分钟基础销毁量: 100亿÷(365*4*1440) = 4756.468797564687
  minuteBurnRate        Decimal   @default(4756.468797564687) @map("minute_burn_rate") @db.Decimal(30, 18)
  // 是否启用交易
  isActive              Boolean   @default(false) @map("is_active")
  // 是否启用买入功能（默认关闭）
  buyEnabled            Boolean   @default(false) @map("buy_enabled")
  // 是否启用深度显示（默认关闭）
  depthEnabled          Boolean   @default(false) @map("depth_enabled")
  // 启动时间
  activatedAt           DateTime? @map("activated_at")
  createdAt             DateTime  @default(now()) @map("created_at")
  updatedAt             DateTime  @updatedAt @map("updated_at")

  @@map("trading_configs")
}

// ==================== 黑洞账户（销毁池）====================

// 黑洞账户
model BlackHole {
  id             String    @id @default(uuid())
  totalBurned    Decimal   @default(0) @map("total_burned") @db.Decimal(30, 8) // 已销毁总量
  targetBurn     Decimal   @map("target_burn") @db.Decimal(30, 8) // 目标销毁量 (10B)
  remainingBurn  Decimal   @map("remaining_burn") @db.Decimal(30, 8) // 剩余待销毁
  lastBurnMinute DateTime? @map("last_burn_minute")
  createdAt      DateTime  @default(now()) @map("created_at")
  updatedAt      DateTime  @updatedAt @map("updated_at")

  records BurnRecord[]

  @@map("black_holes")
}

// 销毁记录
model BurnRecord {
  id              String   @id @default(uuid())
  blackHoleId     String   @map("black_hole_id")
  burnMinute      DateTime @map("burn_minute")
  burnAmount      Decimal  @map("burn_amount") @db.Decimal(30, 18)
  remainingTarget Decimal  @map("remaining_target") @db.Decimal(30, 8) // 销毁后剩余目标

  // 来源信息
  sourceType       String? @map("source_type") // MINUTE_BURN (每分钟销毁), SELL_BURN (卖出销毁)
  sourceAccountSeq String? @map("source_account_seq") // 来源账户序列号（卖出时）
  sourceOrderNo    String? @map("source_order_no") // 来源订单号（卖出时）

  memo      String?  @db.Text
  createdAt DateTime @default(now()) @map("created_at")

  blackHole BlackHole @relation(fields: [blackHoleId], references: [id])

  @@index([burnMinute])
  @@index([sourceAccountSeq])
  @@index([sourceOrderNo])
  @@index([sourceType])
  @@map("burn_records")
}

// ==================== 积分股池（绿积分池）====================

// 积分股池（存储绿积分用于计算价格）
model SharePool {
  id           String   @id @default(uuid())
  // 绿积分总量（用于价格计算的分子）
  greenPoints  Decimal  @default(0) @map("green_points") @db.Decimal(30, 8)
  totalInflow  Decimal  @default(0) @map("total_inflow") @db.Decimal(30, 8)
  totalOutflow Decimal  @default(0) @map("total_outflow") @db.Decimal(30, 8)
  createdAt    DateTime @default(now()) @map("created_at")
  updatedAt    DateTime @updatedAt @map("updated_at")

  transactions SharePoolTransaction[]

  @@map("share_pools")
}

// 积分股池交易记录
model SharePoolTransaction {
  id            String   @id @default(uuid())
  poolId        String   @map("pool_id")
  type          String // INJECT (注入), TRADE_IN (交易流入), TRADE_OUT (交易流出)
  amount        Decimal  @db.Decimal(30, 8)
  balanceBefore Decimal  @map("balance_before") @db.Decimal(30, 8)
  balanceAfter  Decimal  @map("balance_after") @db.Decimal(30, 8)
  referenceId   String?  @map("reference_id")
  referenceType String?  @map("reference_type")
  memo          String?  @db.Text
  createdAt     DateTime @default(now()) @map("created_at")

  pool SharePool @relation(fields: [poolId], references: [id])

  @@index([poolId, createdAt(sort: Desc)])
  @@map("share_pool_transactions")
}

// ==================== 价格快照 ====================

// 价格快照（每分钟）
model PriceSnapshot {
  id                   String   @id @default(uuid())
  snapshotTime         DateTime @unique @map("snapshot_time")
  price                Decimal  @db.Decimal(30, 18) // 当时价格
  greenPoints          Decimal  @map("green_points") @db.Decimal(30, 8) // 绿积分（股池）
  blackHoleAmount      Decimal  @map("black_hole_amount") @db.Decimal(30, 8) // 黑洞数量
  circulationPool      Decimal  @map("circulation_pool") @db.Decimal(30, 8) // 流通池
  effectiveDenominator Decimal  @map("effective_denominator") @db.Decimal(30, 8) // 有效分母
  minuteBurnRate       Decimal  @map("minute_burn_rate") @db.Decimal(30, 18) // 当时的每分钟销毁率
  createdAt            DateTime @default(now()) @map("created_at")

  @@index([snapshotTime(sort: Desc)])
  @@map("price_snapshots")
}

// ==================== 交易账户 ====================

// 用户交易账户
model TradingAccount {
  id              String   @id @default(uuid())
  accountSequence String   @unique
  shareBalance    Decimal  @default(0) @db.Decimal(30, 8) // 积分股余额
  cashBalance     Decimal  @default(0) @db.Decimal(30, 8) // 现金余额
  frozenShares    Decimal  @default(0) @db.Decimal(30, 8) // 冻结积分股
  frozenCash      Decimal  @default(0) @db.Decimal(30, 8) // 冻结现金
  totalBought     Decimal  @default(0) @db.Decimal(30, 8) // 累计买入量
  totalSold       Decimal  @default(0) @db.Decimal(30, 8) // 累计卖出量
  createdAt       DateTime @default(now())
  updatedAt       DateTime @updatedAt

  orders       Order[]
  transactions TradingTransaction[]

  @@map("trading_accounts")
}

// ==================== 订单 ====================

// 交易订单
model Order {
  id                String    @id @default(uuid())
  orderNo           String    @unique // 订单号
  accountSequence   String
  type              String // BUY, SELL
  status            String // PENDING, PARTIAL, FILLED, CANCELLED
  price             Decimal   @db.Decimal(30, 18) // 挂单价格
  quantity          Decimal   @db.Decimal(30, 8) // 订单数量
  filledQuantity    Decimal   @default(0) @db.Decimal(30, 8) // 已成交数量
  remainingQuantity Decimal   @db.Decimal(30, 8) // 剩余数量
  averagePrice      Decimal   @default(0) @db.Decimal(30, 18) // 平均成交价
  totalAmount       Decimal   @default(0) @db.Decimal(30, 8) // 总成交金额
  // 卖出销毁相关字段
  burnQuantity      Decimal   @default(0) @map("burn_quantity") @db.Decimal(30, 8) // 卖出销毁量
  burnMultiplier    Decimal   @default(0) @map("burn_multiplier") @db.Decimal(30, 18) // 销毁倍数
  effectiveQuantity Decimal   @default(0) @map("effective_quantity") @db.Decimal(30, 8) // 有效卖出量（含销毁）
  // 订单来源
  source            String    @default("USER") // USER, MARKET_MAKER, DEX_BOT, SYSTEM
  sourceLabel       String?   @map("source_label") // 可读标签：如 "用户挂单", "做市商吃单"
  createdAt         DateTime  @default(now())
  updatedAt         DateTime  @updatedAt
  cancelledAt       DateTime?
  completedAt       DateTime?

  account TradingAccount @relation(fields: [accountSequence], references: [accountSequence])
  trades  Trade[]

  @@index([accountSequence, status])
  @@index([type, status, price])
  @@index([createdAt(sort: Desc)])
  @@index([source])
  @@map("orders")
}

// 成交记录
model Trade {
  id             String   @id @default(uuid())
  tradeNo        String   @unique
  buyOrderId     String   @map("buy_order_id")
  sellOrderId    String   @map("sell_order_id")
  buyerSequence  String   @map("buyer_sequence")
  sellerSequence String   @map("seller_sequence")
  price            Decimal  @db.Decimal(30, 18)
  quantity         Decimal  @db.Decimal(30, 8) // 有效积分股（含销毁倍数）
  originalQuantity Decimal  @default(0) @map("original_quantity") @db.Decimal(30, 8) // 原始卖出数量
  burnQuantity     Decimal  @default(0) @map("burn_quantity") @db.Decimal(30, 8) // 卖出销毁量
  effectiveQty     Decimal  @default(0) @map("effective_qty") @db.Decimal(30, 8) // 有效量（保留兼容，同quantity）
  amount         Decimal  @db.Decimal(30, 8) // 卖方实际收到金额（扣除手续费后）
  fee            Decimal  @default(0) @db.Decimal(30, 8) // 交易手续费（10%进入积分股池）
  // 交易来源标识
  buyerSource    String   @default("USER") @map("buyer_source") // USER, MARKET_MAKER, DEX_BOT, SYSTEM
  sellerSource   String   @default("USER") @map("seller_source") // USER, MARKET_MAKER, DEX_BOT, SYSTEM
  createdAt      DateTime @default(now()) @map("created_at")

  buyOrder Order @relation(fields: [buyOrderId], references: [id])

  @@index([buyerSequence])
  @@index([sellerSequence])
  @@index([buyerSource])
  @@index([sellerSource])
  @@index([createdAt(sort: Desc)])
  @@map("trades")
}

// ==================== 交易流水 ====================

model TradingTransaction {
  id              String  @id @default(uuid())
  accountSequence String
  type            String // TRANSFER_IN, TRANSFER_OUT, BUY, SELL, FREEZE, UNFREEZE, DEPOSIT, WITHDRAW
  assetType       String // SHARE, CASH
  amount          Decimal @db.Decimal(30, 8)
  balanceBefore   Decimal @db.Decimal(30, 8)
  balanceAfter    Decimal @db.Decimal(30, 8)
  referenceId     String?
  referenceType   String?

  // 交易对手方信息（关键：用户ID和账户序列号）
  counterpartyType       String? @map("counterparty_type") // USER, POOL, SYSTEM
  counterpartyAccountSeq String? @map("counterparty_account_seq") // 对手方账户序列号
  counterpartyUserId     String? @map("counterparty_user_id") // 对手方用户ID

  // 详细备注（包含完整交易信息，格式: "卖出给用户[U123456], 价格0.5USDT"）
  memo        String?  @db.Text
  description String? // 保留兼容旧字段
  createdAt   DateTime @default(now())

  account TradingAccount @relation(fields: [accountSequence], references: [accountSequence])

  @@index([accountSequence, createdAt(sort: Desc)])
  @@index([counterpartyAccountSeq])
  @@index([counterpartyUserId])
  @@map("trading_transactions")
}

// ==================== 流通池 ====================

// 流通池（交易所流通池）
model CirculationPool {
  id           String   @id @default(uuid())
  totalShares  Decimal  @default(0) @db.Decimal(30, 8) // 流通池中的积分股
  totalCash    Decimal  @default(0) @db.Decimal(30, 8) // 流通池中的现金（股池）
  totalInflow  Decimal  @default(0) @db.Decimal(30, 8) // 累计流入
  totalOutflow Decimal  @default(0) @db.Decimal(30, 8) // 累计流出
  createdAt    DateTime @default(now())
  updatedAt    DateTime @updatedAt

  transactions CirculationPoolTransaction[]

  @@map("circulation_pools")
}

// 流通池变动记录（包含交易对手方信息）
model CirculationPoolTransaction {
  id            String  @id @default(uuid())
  poolId        String  @map("pool_id")
  type          String // SHARE_IN, SHARE_OUT, CASH_IN, CASH_OUT, TRADE_BUY, TRADE_SELL
  assetType     String // SHARE, CASH
  amount        Decimal @db.Decimal(30, 8)
  balanceBefore Decimal @map("balance_before") @db.Decimal(30, 8)
  balanceAfter  Decimal @map("balance_after") @db.Decimal(30, 8)

  // 交易对手方信息（关键：用户ID和账户序列号）
  counterpartyType       String? @map("counterparty_type") // USER, POOL, SYSTEM, EXTERNAL
  counterpartyAccountSeq String? @map("counterparty_account_seq") // 对手方账户序列号
  counterpartyUserId     String? @map("counterparty_user_id") // 对手方用户ID

  // 关联信息
  referenceId   String? @map("reference_id") // 关联业务ID（如订单ID、交易ID）
  referenceType String? @map("reference_type") // 关联类型（ORDER, TRADE, TRANSFER）

  // 详细备注（包含完整交易信息）
  // 格式示例: "用户[U123456]买入100股, 订单号ORD20240110001"
  memo String? @db.Text

  // 扩展数据
  metadata Json?

  createdAt DateTime @default(now()) @map("created_at")

  pool CirculationPool @relation(fields: [poolId], references: [id])

  @@index([poolId, createdAt(sort: Desc)])
  @@index([type, assetType])
  @@index([counterpartyAccountSeq])
  @@index([counterpartyUserId])
  @@index([referenceId])
  @@index([createdAt(sort: Desc)])
  @@map("circulation_pool_transactions")
}

// 保留旧的PoolTransaction以兼容（标记为废弃，后续迁移后删除）
// @deprecated 使用 CirculationPoolTransaction 替代
model PoolTransaction {
  id          String   @id @default(uuid())
  type        String // SHARE_IN, SHARE_OUT, CASH_IN, CASH_OUT
  amount      Decimal  @db.Decimal(30, 8)
  referenceId String?
  description String?
  createdAt   DateTime @default(now())

  @@index([createdAt(sort: Desc)])
  @@map("pool_transactions")
}

// ==================== K线数据 ====================

// 分钟K线
model MinuteKLine {
  id         String   @id @default(uuid())
  minute     DateTime @unique
  open       Decimal  @db.Decimal(30, 18)
  high       Decimal  @db.Decimal(30, 18)
  low        Decimal  @db.Decimal(30, 18)
  close      Decimal  @db.Decimal(30, 18)
  volume     Decimal  @db.Decimal(30, 8) // 成交量
  amount     Decimal  @db.Decimal(30, 8) // 成交额
  tradeCount Int      @default(0) // 成交笔数
  createdAt  DateTime @default(now())

  @@index([minute(sort: Desc)])
  @@map("minute_klines")
}

// 小时K线
model HourKLine {
  id         String   @id @default(uuid())
  hour       DateTime @unique
  open       Decimal  @db.Decimal(30, 18)
  high       Decimal  @db.Decimal(30, 18)
  low        Decimal  @db.Decimal(30, 18)
  close      Decimal  @db.Decimal(30, 18)
  volume     Decimal  @db.Decimal(30, 8)
  amount     Decimal  @db.Decimal(30, 8)
  tradeCount Int      @default(0)
  createdAt  DateTime @default(now())

  @@index([hour(sort: Desc)])
  @@map("hour_klines")
}

// 日K线
model DayKLine {
  id         String   @id @default(uuid())
  date       DateTime @unique @db.Date
  open       Decimal  @db.Decimal(30, 18)
  high       Decimal  @db.Decimal(30, 18)
  low        Decimal  @db.Decimal(30, 18)
  close      Decimal  @db.Decimal(30, 18)
  volume     Decimal  @db.Decimal(30, 8)
  amount     Decimal  @db.Decimal(30, 8)
  tradeCount Int      @default(0)
  createdAt  DateTime @default(now())

  @@index([date(sort: Desc)])
  @@map("day_klines")
}

// ==================== 划转记录 ====================

// 从挖矿账户划转记录
model TransferRecord {
  id              String    @id @default(uuid())
  transferNo      String    @unique
  accountSequence String
  direction       String // IN (从挖矿账户划入), OUT (划出到挖矿账户)
  amount          Decimal   @db.Decimal(30, 8)
  status          String // PENDING, COMPLETED, FAILED
  miningTxId      String? // 挖矿服务的交易ID
  errorMessage    String?
  createdAt       DateTime  @default(now())
  completedAt     DateTime?

  @@index([accountSequence])
  @@index([status])
  @@map("transfer_records")
}

// P2P用户间转账记录
model P2pTransfer {
  id                  String    @id @default(uuid())
  transferNo          String    @unique @map("transfer_no")
  fromAccountSequence String    @map("from_account_sequence")
  toAccountSequence   String    @map("to_account_sequence")
  toPhone             String    @map("to_phone") // 收款方手机号（用于显示）
  toNickname          String?   @map("to_nickname") // 收款方昵称
  fromPhone           String?   @map("from_phone") // 发送方手机号
  fromNickname        String?   @map("from_nickname") // 发送方昵称
  amount              Decimal   @db.Decimal(30, 8)
  fee                 Decimal   @default(0) @db.Decimal(30, 8) // P2P转账手续费
  memo                String?   @db.Text // 备注
  status              String    @default("PENDING") // PENDING, COMPLETED, FAILED
  errorMessage        String?   @map("error_message")
  createdAt           DateTime  @default(now()) @map("created_at")
  completedAt         DateTime? @map("completed_at")

  @@index([fromAccountSequence])
  @@index([toAccountSequence])
  @@index([status])
  @@index([createdAt(sort: Desc)])
  @@map("p2p_transfers")
}

// ==================== Outbox ====================

enum OutboxStatus {
  PENDING
  PUBLISHED
  FAILED
}

model OutboxEvent {
  id            String       @id @default(uuid())
  aggregateType String       @map("aggregate_type")
  aggregateId   String       @map("aggregate_id")
  eventType     String       @map("event_type")
  payload       Json
  topic         String       @default("trading.events")
  key           String?
  status        OutboxStatus @default(PENDING)
  retryCount    Int          @default(0) @map("retry_count")
  maxRetries    Int          @default(10) @map("max_retries")
  lastError     String?      @map("last_error")
  publishedAt   DateTime?    @map("published_at")
  nextRetryAt   DateTime?    @map("next_retry_at")
  createdAt     DateTime     @default(now()) @map("created_at")

  @@index([status])
  @@index([nextRetryAt])
  @@index([createdAt])
  @@map("outbox_events")
}

// ==================== 已处理事件（幂等性）====================

// 已处理事件记录（用于消费者幂等性检查）
model ProcessedEvent {
  id            String   @id @default(uuid())
  eventId       String   @unique @map("event_id") // 事件唯一ID
  eventType     String   @map("event_type") // 事件类型
  sourceService String   @map("source_service") // 来源服务
  processedAt   DateTime @default(now()) @map("processed_at")

  @@index([eventId])
  @@index([processedAt])
  @@map("processed_events")
}

// ==================== 做市商 ====================

// 做市商配置
model MarketMakerConfig {
  id                String    @id @default(uuid())
  name              String    @unique // 做市商名称，如 "MAIN_MARKET_MAKER"
  accountSequence   String    @unique @map("account_sequence") // 做市商专用交易账户

  // ============ 区块链钱包配置（MPC）============
  // fUSDT (积分值) 做市商 Kava 链钱包地址（MPC 钱包，用于充值监控和提现）
  kavaWalletAddress      String?   @map("kava_wallet_address") @db.VarChar(42)
  // eUSDT (积分股) 做市商 Kava 链钱包地址（MPC 钱包，用于积分股充值监控和提现）
  eusdtWalletAddress     String?   @map("eusdt_wallet_address") @db.VarChar(42)
  // MPC 用户名（用于签名提现交易）
  mpcUsername       String?   @map("mpc_username") @db.VarChar(100)

  // 资金配置（从TradingAccount同步，此处仅用于快速查询）
  cashBalance       Decimal   @default(0) @map("cash_balance") @db.Decimal(30, 8) // 资金池余额（积分值/fUSDT）
  shareBalance      Decimal   @default(0) @map("share_balance") @db.Decimal(30, 8) // 持有积分股余额（eUSDT）
  frozenCash        Decimal   @default(0) @map("frozen_cash") @db.Decimal(30, 8) // 冻结资金
  frozenShares      Decimal   @default(0) @map("frozen_shares") @db.Decimal(30, 8) // 冻结积分股

  // ============ 吃单策略配置（原有） ============
  maxBuyRatio       Decimal   @default(0.05) @map("max_buy_ratio") @db.Decimal(10, 4) // 单次最大买入比例（资金池的百分比）
  minIntervalMs     Int       @default(1000) @map("min_interval_ms") // 最小吃单间隔（毫秒）
  maxIntervalMs     Int       @default(4000) @map("max_interval_ms") // 最大吃单间隔（毫秒）
  priceStrategy     String    @default("TAKER") @map("price_strategy") // 价格策略: TAKER(按卖单价), MARKET(市场价), DISCOUNT(折扣价)
  discountRate      Decimal   @default(1.0) @map("discount_rate") @db.Decimal(10, 4) // 折扣率（仅DISCOUNT策略时生效）

  // ============ 双边挂单配置（深度做市） ============
  // 挂单模式开关
  makerEnabled      Boolean   @default(false) @map("maker_enabled") // 是否启用挂单模式（双边深度）

  // 买单挂单配置
  bidEnabled        Boolean   @default(true) @map("bid_enabled") // 是否挂买单
  bidLevels         Int       @default(5) @map("bid_levels") // 买单档位数
  bidSpread         Decimal   @default(0.01) @map("bid_spread") @db.Decimal(10, 4) // 买单价差（相对市价，如0.01表示1%）
  bidLevelSpacing   Decimal   @default(0.005) @map("bid_level_spacing") @db.Decimal(10, 4) // 买单档位间距（如0.005表示0.5%）
  bidQuantityPerLevel Decimal @default(1000) @map("bid_quantity_per_level") @db.Decimal(30, 8) // 每档买单数量

  // 卖单挂单配置
  askEnabled        Boolean   @default(true) @map("ask_enabled") // 是否挂卖单
  askLevels         Int       @default(5) @map("ask_levels") // 卖单档位数
  askSpread         Decimal   @default(0.01) @map("ask_spread") @db.Decimal(10, 4) // 卖单价差（相对市价）
  askLevelSpacing   Decimal   @default(0.005) @map("ask_level_spacing") @db.Decimal(10, 4) // 卖单档位间距
  askQuantityPerLevel Decimal @default(1000) @map("ask_quantity_per_level") @db.Decimal(30, 8) // 每档卖单数量

  // 挂单刷新配置
  refreshIntervalMs Int       @default(60000) @map("refresh_interval_ms") // 挂单刷新间隔（毫秒）
  lastRefreshAt     DateTime? @map("last_refresh_at") // 上次刷新时间

  // ============ 运行状态 ============
  isActive          Boolean   @default(false) @map("is_active") // 是否启用（吃单模式）
  lastRunAt         DateTime? @map("last_run_at") // 上次运行时间

  // ============ 统计 ============
  totalBuyCount     Int       @default(0) @map("total_buy_count") // 累计买入次数
  totalBuyQuantity  Decimal   @default(0) @map("total_buy_quantity") @db.Decimal(30, 8) // 累计买入量
  totalBuyAmount    Decimal   @default(0) @map("total_buy_amount") @db.Decimal(30, 8) // 累计买入金额
  totalSellCount    Int       @default(0) @map("total_sell_count") // 累计卖出次数
  totalSellQuantity Decimal   @default(0) @map("total_sell_quantity") @db.Decimal(30, 8) // 累计卖出量
  totalSellAmount   Decimal   @default(0) @map("total_sell_amount") @db.Decimal(30, 8) // 累计卖出金额
  createdAt         DateTime  @default(now()) @map("created_at")
  updatedAt         DateTime  @updatedAt @map("updated_at")

  ledgers MarketMakerLedger[]
  makerOrders MarketMakerOrder[]
  deposits MarketMakerDeposit[]
  withdraws MarketMakerWithdraw[]

  @@map("market_maker_configs")
}

// 做市商挂单记录（跟踪做市商当前活跃的挂单）
model MarketMakerOrder {
  id              String   @id @default(uuid())
  marketMakerId   String   @map("market_maker_id")
  orderId         String   @unique @map("order_id") // 关联的订单ID
  orderNo         String   @unique @map("order_no") // 关联的订单号
  side            String   // BID(买单), ASK(卖单)
  level           Int      // 档位（1=最优，越大越远离市价）
  price           Decimal  @db.Decimal(30, 18) // 挂单价格
  quantity        Decimal  @db.Decimal(30, 8) // 挂单数量
  remainingQty    Decimal  @map("remaining_qty") @db.Decimal(30, 8) // 剩余数量
  status          String   @default("ACTIVE") // ACTIVE, FILLED, CANCELLED
  createdAt       DateTime @default(now()) @map("created_at")
  updatedAt       DateTime @updatedAt @map("updated_at")

  marketMaker MarketMakerConfig @relation(fields: [marketMakerId], references: [id])

  @@index([marketMakerId, side, status])
  @@index([status])
  @@map("market_maker_orders")
}

// 做市商分类账（流水明细）
model MarketMakerLedger {
  id              String   @id @default(uuid())
  marketMakerId   String   @map("market_maker_id")
  // 交易类型
  type            String // DEPOSIT(充值), WITHDRAW(提现), BUY(买入), SELL(卖出), FREEZE(冻结), UNFREEZE(解冻)
  assetType       String   @map("asset_type") // CASH, SHARE
  // 金额变动
  amount          Decimal  @db.Decimal(30, 8)
  balanceBefore   Decimal  @map("balance_before") @db.Decimal(30, 8)
  balanceAfter    Decimal  @map("balance_after") @db.Decimal(30, 8)
  // 关联信息
  tradeId         String?  @map("trade_id") // 关联成交ID
  tradeNo         String?  @map("trade_no") // 关联成交号
  orderId         String?  @map("order_id") // 关联订单ID
  orderNo         String?  @map("order_no") // 关联订单号
  // 交易对手方
  counterpartySeq String?  @map("counterparty_seq") // 交易对手账户序列号
  counterpartyId  String?  @map("counterparty_id") // 交易对手用户ID
  // 价格信息（仅BUY/SELL时）
  price           Decimal? @db.Decimal(30, 18) // 成交价格
  quantity        Decimal? @db.Decimal(30, 8) // 成交数量
  // 备注
  memo            String?  @db.Text
  createdAt       DateTime @default(now()) @map("created_at")

  marketMaker MarketMakerConfig @relation(fields: [marketMakerId], references: [id])

  @@index([marketMakerId, createdAt(sort: Desc)])
  @@index([type])
  @@index([tradeNo])
  @@index([orderNo])
  @@index([counterpartySeq])
  @@index([createdAt(sort: Desc)])
  @@map("market_maker_ledgers")
}

// 做市商日统计
model MarketMakerDailyStats {
  id              String   @id @default(uuid())
  marketMakerId   String   @map("market_maker_id")
  date            DateTime @db.Date
  // 买入统计
  buyCount        Int      @default(0) @map("buy_count")
  buyQuantity     Decimal  @default(0) @map("buy_quantity") @db.Decimal(30, 8)
  buyAmount       Decimal  @default(0) @map("buy_amount") @db.Decimal(30, 8)
  avgBuyPrice     Decimal  @default(0) @map("avg_buy_price") @db.Decimal(30, 18)
  // 卖出统计
  sellCount       Int      @default(0) @map("sell_count")
  sellQuantity    Decimal  @default(0) @map("sell_quantity") @db.Decimal(30, 8)
  sellAmount      Decimal  @default(0) @map("sell_amount") @db.Decimal(30, 8)
  avgSellPrice    Decimal  @default(0) @map("avg_sell_price") @db.Decimal(30, 18)
  // 盈亏
  realizedPnl     Decimal  @default(0) @map("realized_pnl") @db.Decimal(30, 8) // 已实现盈亏
  // 余额快照
  cashBalanceEnd  Decimal  @default(0) @map("cash_balance_end") @db.Decimal(30, 8)
  shareBalanceEnd Decimal  @default(0) @map("share_balance_end") @db.Decimal(30, 8)
  createdAt       DateTime @default(now()) @map("created_at")
  updatedAt       DateTime @updatedAt @map("updated_at")

  @@unique([marketMakerId, date])
  @@index([marketMakerId, date(sort: Desc)])
  @@map("market_maker_daily_stats")
}

// ==================== C2C 场外交易 ====================

// C2C订单类型
enum C2cOrderType {
  BUY  // 买入积分股（用积分值换积分股）
  SELL // 卖出积分股（用积分股换积分值）
}

// C2C订单状态
enum C2cOrderStatus {
  PENDING    // 待接单
  MATCHED    // 已匹配（等待付款）
  PAID       // 已付款（等待确认收款）
  COMPLETED  // 已完成
  CANCELLED  // 已取消
  EXPIRED    // 已过期
}

// C2C订单
model C2cOrder {
  id                    String        @id @default(uuid())
  orderNo               String        @unique @map("order_no")
  type                  C2cOrderType
  status                C2cOrderStatus @default(PENDING)

  // 挂单方（Maker）
  makerAccountSequence  String        @map("maker_account_sequence")
  makerUserId           String?       @map("maker_user_id")
  makerPhone            String?       @map("maker_phone")
  makerNickname         String?       @map("maker_nickname")

  // 接单方（Taker）
  takerAccountSequence  String?       @map("taker_account_sequence")
  takerUserId           String?       @map("taker_user_id")
  takerPhone            String?       @map("taker_phone")
  takerNickname         String?       @map("taker_nickname")

  // 交易信息
  price                 Decimal       @db.Decimal(30, 18) // 单价
  quantity              Decimal       @db.Decimal(30, 8)  // 数量（积分股）
  totalAmount           Decimal       @map("total_amount") @db.Decimal(30, 8) // 总金额（积分值）
  minAmount             Decimal       @default(0) @map("min_amount") @db.Decimal(30, 8) // 最小交易量
  maxAmount             Decimal       @default(0) @map("max_amount") @db.Decimal(30, 8) // 最大交易量

  // 卖方收款信息（卖单必填，买单买家需提供）
  paymentMethod         String?           @map("payment_method")  // 收款方式（GREEN_POINTS/ALIPAY/WECHAT/BANK，可逗号分隔）
  paymentAccount        String?       @map("payment_account")      // 收款账号
  paymentQrCode         String?       @map("payment_qr_code")      // 收款二维码URL
  paymentRealName       String?       @map("payment_real_name")    // 收款人实名

  // 备注
  remark                String?       @db.Text

  // 订单超时配置
  paymentTimeoutMinutes Int           @default(15) @map("payment_timeout_minutes") // 付款超时时间（分钟）
  confirmTimeoutMinutes Int           @default(60) @map("confirm_timeout_minutes") // 确认收款超时时间（分钟）
  paymentDeadline       DateTime?     @map("payment_deadline")     // 付款截止时间
  confirmDeadline       DateTime?     @map("confirm_deadline")     // 确认收款截止时间

  // 付款水单（买方上传的付款凭证图片）
  paymentProofUrl       String?       @map("payment_proof_url")

  // ============ Bot 自动购买相关 ============
  // 卖家 Kava 地址（从 SyncedUser 表获取，用于接收 dUSDT）
  sellerKavaAddress     String?       @map("seller_kava_address")
  // 是否被 Bot 购买
  botPurchased          Boolean       @default(false) @map("bot_purchased")
  // dUSDT 支付交易哈希
  paymentTxHash         String?       @map("payment_tx_hash")

  // 时间戳
  createdAt             DateTime      @default(now()) @map("created_at")
  updatedAt             DateTime      @updatedAt @map("updated_at")
  matchedAt             DateTime?     @map("matched_at")
  paidAt                DateTime?     @map("paid_at")
  completedAt           DateTime?     @map("completed_at")
  cancelledAt           DateTime?     @map("cancelled_at")
  expiredAt             DateTime?     @map("expired_at")

  @@index([status])
  @@index([type, status])
  @@index([makerAccountSequence])
  @@index([takerAccountSequence])
  @@index([createdAt(sort: Desc)])
  @@index([paymentDeadline])
  @@index([confirmDeadline])
  @@index([botPurchased])
  @@map("c2c_orders")
}

// ==================== 做市商链上充提记录 ====================

// 做市商充值类型
enum MarketMakerAssetType {
  EUSDT  // 积分股 (Energy USDT)
  FUSDT  // 积分值 (Future USDT)
}

// 做市商充值状态
enum MarketMakerDepositStatus {
  DETECTED   // 已检测到
  CONFIRMING // 确认中
  CONFIRMED  // 已确认
  CREDITED   // 已入账
  FAILED     // 失败
}

// 做市商充值记录（从区块链检测到的充值）
model MarketMakerDeposit {
  id              String                   @id @default(uuid())
  marketMakerId   String                   @map("market_maker_id")

  // 区块链信息
  chainType       String                   @map("chain_type") @db.VarChar(20) // KAVA
  txHash          String                   @unique @map("tx_hash") @db.VarChar(66) // 交易哈希（唯一）
  blockNumber     BigInt                   @map("block_number")
  blockTimestamp  DateTime                 @map("block_timestamp")

  // 资产信息
  assetType       MarketMakerAssetType     @map("asset_type") // EUSDT 或 FUSDT
  tokenContract   String                   @map("token_contract") @db.VarChar(42) // 代币合约地址
  fromAddress     String                   @map("from_address") @db.VarChar(42) // 来源地址
  toAddress       String                   @map("to_address") @db.VarChar(42) // 做市商钱包地址
  amount          Decimal                  @db.Decimal(36, 8) // 充值金额
  amountRaw       Decimal                  @map("amount_raw") @db.Decimal(78, 0) // 原始金额（wei）

  // 确认状态
  confirmations   Int                      @default(0) // 当前确认数
  requiredConfirms Int                     @default(12) @map("required_confirms") // 所需确认数
  status          MarketMakerDepositStatus @default(DETECTED)

  // 入账信息
  creditedAt      DateTime?                @map("credited_at") // 入账时间
  creditedAmount  Decimal?                 @map("credited_amount") @db.Decimal(36, 8) // 入账金额
  ledgerId        String?                  @map("ledger_id") // 关联的 Ledger 记录 ID

  // 错误信息
  errorMessage    String?                  @map("error_message") @db.Text

  createdAt       DateTime                 @default(now()) @map("created_at")
  updatedAt       DateTime                 @updatedAt @map("updated_at")

  marketMaker     MarketMakerConfig        @relation(fields: [marketMakerId], references: [id])

  @@index([marketMakerId])
  @@index([status])
  @@index([chainType, status])
  @@index([assetType])
  @@index([blockNumber])
  @@index([createdAt(sort: Desc)])
  @@map("market_maker_deposits")
}

// 做市商提现状态
enum MarketMakerWithdrawStatus {
  PENDING    // 待处理
  SIGNING    // 签名中（MPC）
  SIGNED     // 已签名
  BROADCAST  // 已广播
  CONFIRMING // 确认中
  COMPLETED  // 已完成
  FAILED     // 失败
  CANCELLED  // 已取消
}

// 做市商提现记录
model MarketMakerWithdraw {
  id              String                    @id @default(uuid())
  withdrawNo      String                    @unique @map("withdraw_no") // 提现单号
  marketMakerId   String                    @map("market_maker_id")

  // 资产信息
  assetType       MarketMakerAssetType      @map("asset_type") // EUSDT 或 FUSDT
  amount          Decimal                   @db.Decimal(36, 8) // 提现金额

  // 区块链信息
  chainType       String                    @map("chain_type") @db.VarChar(20) // KAVA
  tokenContract   String                    @map("token_contract") @db.VarChar(42) // 代币合约地址
  fromAddress     String                    @map("from_address") @db.VarChar(42) // 做市商钱包地址
  toAddress       String                    @map("to_address") @db.VarChar(42) // 目标地址

  // 交易信息
  txHash          String?                   @map("tx_hash") @db.VarChar(66) // 交易哈希
  blockNumber     BigInt?                   @map("block_number")
  confirmations   Int                       @default(0)
  gasUsed         Decimal?                  @map("gas_used") @db.Decimal(36, 0)
  gasPrice        Decimal?                  @map("gas_price") @db.Decimal(36, 0)

  // 状态
  status          MarketMakerWithdrawStatus @default(PENDING)

  // 关联 Ledger
  ledgerId        String?                   @map("ledger_id") // 冻结时的 Ledger 记录 ID

  // 错误信息
  errorMessage    String?                   @map("error_message") @db.Text
  retryCount      Int                       @default(0) @map("retry_count")

  // 时间戳
  createdAt       DateTime                  @default(now()) @map("created_at")
  updatedAt       DateTime                  @updatedAt @map("updated_at")
  signedAt        DateTime?                 @map("signed_at")
  broadcastAt     DateTime?                 @map("broadcast_at")
  completedAt     DateTime?                 @map("completed_at")
  cancelledAt     DateTime?                 @map("cancelled_at")

  marketMaker     MarketMakerConfig         @relation(fields: [marketMakerId], references: [id])

  @@index([marketMakerId])
  @@index([status])
  @@index([assetType])
  @@index([txHash])
  @@index([createdAt(sort: Desc)])
  @@map("market_maker_withdraws")
}

// ==================== 审计分类账（Append-Only）====================
// 用于记录敏感操作的不可变审计日志
// 设计原则：只增加，不修改，不删除

// 审计操作类型
enum AuditActionType {
  SELL_ORDER_CREATED        // 卖出订单创建
  SELL_ORDER_EXECUTED       // 卖出订单成交
  TRADE_PASSWORD_SET        // 支付密码设置
  TRADE_PASSWORD_CHANGED    // 支付密码修改
  TRADE_PASSWORD_VERIFIED   // 支付密码验证成功
  TRADE_PASSWORD_FAILED     // 支付密码验证失败
  TRANSFER_IN               // 划入交易账户
  TRANSFER_OUT              // 划出到分配账户
  P2P_TRANSFER              // P2P转账
}

// 审计分类账
model AuditLedger {
  id              String          @id @default(uuid())

  // 用户标识
  accountSequence String          @map("account_sequence")

  // 操作信息
  actionType      AuditActionType @map("action_type")
  actionDetail    Json            @map("action_detail") // 操作详情（JSON格式）

  // 请求上下文
  ipAddress       String?         @map("ip_address") @db.VarChar(45)
  userAgent       String?         @map("user_agent") @db.Text

  // 链式哈希（保证完整性）
  prevHash        String?         @map("prev_hash") @db.VarChar(64) // 前一条记录的哈希
  recordHash      String          @map("record_hash") @db.VarChar(64) // 当前记录的哈希

  // 关联业务ID（可选）
  referenceId     String?         @map("reference_id") // 订单ID、交易ID等
  referenceType   String?         @map("reference_type") // ORDER, TRADE, TRANSFER等

  // 时间戳（不可变）
  createdAt       DateTime        @default(now()) @map("created_at")

  @@index([accountSequence, createdAt(sort: Desc)])
  @@index([actionType])
  @@index([referenceId])
  @@index([createdAt(sort: Desc)])
  @@map("audit_ledgers")
}
