// 扯旋（丁二皇）核心数据类型 —— 当前阶段仅用于驱动前台 UI

/** 花色：红 = 红桃/方片，黑 = 黑桃/梅花，joker = 大王 */
export type Suit = 'heart' | 'diamond' | 'spade' | 'club' | 'joker';

/** 牌面点数 */
export type Rank = '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | 'J' | 'Q' | 'K' | 'JOKER';

export interface Card {
  id: string;
  suit: Suit;
  rank: Rank;
  /** 是否明牌（对所有人可见）；暗牌仅本人可见 */
  faceUp: boolean;
}

/** 玩家本局状态 */
export type SeatStatus =
  | 'playing' // 正常游戏中
  | 'folded' // 丢牌
  | 'knocked' // 敲（下满簸簸，等待比牌）
  | 'rested'; // 休（本轮放弃发话）

/** 游戏阶段 */
export type Phase = 'dealing' | 'betting' | 'split' | 'settle';

/** 下注/发话动作 */
export type BetAction = 'raise' | 'call' | 'knock' | 'rest' | 'fold';

export interface Seat {
  id: string;
  name: string;
  avatar: string; // emoji 头像，占位用
  chips: number; // 剩余旋点/筹码
  betThisRound: number; // 本轮已投入
  totalBet: number; // 本局累计投入
  status: SeatStatus;
  cards: Card[];
  isDealer: boolean; // 是否庄家
  isHero: boolean; // 是否本人（底部座位）
  isActive: boolean; // 是否轮到该玩家发话
  handHint?: string; // 本人当前牌型提示（如"一对""尾大"）
  cardHint?: string; // 明牌点数/牌型标签（如"9点""和对""虎头对"）
  reserved?: boolean; // 留座中（占位空座）
  /** 统一状态/操作徽标文字（如 搓牌中 / 分牌中 / 已分牌 / 大 / 休 / 敲 / 跟 / 丢） */
  tag?: string;
  /** 徽标配色种类 */
  tagKind?: 'fold' | 'rest' | 'knock' | 'call' | 'raise' | 'split' | 'splitting' | 'reserve';
  /** 已下满簸簸（敲/全下） */
  allIn?: boolean;
  /** 本轮是否已发话 */
  actedThisRound?: boolean;
  /** 本人手动分牌选定的「一墩」两张牌 id（系统据此整理头≥尾） */
  manualHeadIds?: string[];
}

/** 中央提示（人数不足自动结算等） */
export interface TableNotice {
  text: string; // 主提示文字
  countdown: number; // 倒计时秒数
}

/** 奖池：奖励牌型 + 比例 */
export interface JackpotReward {
  hand: string; // 牌型名（天皇/朵皇/朵朵）
  percent: number; // 获奖比例
}
export interface JackpotLevel {
  label: string; // 1皮/2皮/5皮/10皮/20皮/50皮
  amount: number; // 该级别奖池数额
}
export interface JackpotRecord {
  player: string;
  hand: string;
  amount: number;
  date: string;
}
export interface Jackpot {
  total: number; // 奖池总奖金
  levels: JackpotLevel[];
  rewards: JackpotReward[];
  topWinner: JackpotRecord; // 最大赢家
  records: JackpotRecord[]; // 得奖记录
  note: string; // 规则说明
}

/** 本局爆奖事件（拿到奖励牌型触发） */
export interface JackpotHit {
  seatId: string;
  player: string;
  hand: string; // 牌型名（天牌/地牌/人牌）
  percent: number; // 获奖比例
  amount: number; // 实际奖金
}

/** 单家本局结算结果 */
export interface PlayerResult {
  seatId: string;
  name: string;
  delta: number; // 本局输赢（含芒果/皮）
  handName: string; // 牌型描述（如 头:天牌 / 尾:人牌）
  special?: '三花十' | '三花六';
  won: boolean;
  headCards?: Card[]; // 赢家/比牌者的头墩两张
  tailCards?: Card[]; // 尾墩两张
}

export interface GameState {
  seats: Seat[];
  pot: number; // 底池总额
  bobo: number; // 簸簸数（本局最大投入）
  baseChip: number; // 底皮
  round: number; // 第几轮发牌（1-3）
  currentBet: number; // 本轮当前注额
  mangoPool: number; // 芒果池（休芒）
  mangoMult: number; // 休芒倍数（×1/×2…，每发生一次全员休递增）
  piPool: number; // 皮池
  roomId: string; // 房号
  dealSeq: number; // 发牌序号（每发一轮新牌递增，驱动飞牌动画）
  rule: string; // 规则简述（如"手手芒/休芒/捵芒"）
  phase: Phase;
  actorIndex: number; // 当前发话者座位索引（-1 表示无）
  dealerIndex: number; // 庄家座位索引
  message?: string; // 当前动作提示（如"老王 大 +40"）
  results?: PlayerResult[]; // settle 阶段的结算结果
  notice?: TableNotice; // 中央提示（人数不足自动结算等）
  jackpot: Jackpot; // 奖池数据
  jackpotHit?: JackpotHit; // 本局爆奖事件（触发金币散落+横幅）
}
