// 回响星核 / Echo Nexus — 核心类型定义

/** 资源类型 */
export type ResourceType = "crystals" | "insights" | "energy";

/** 晶体稀有度（决定解码阵列规模与奖励） */
export type CrystalTier = 1 | 2 | 3;

/** 共振颜色（解码谜题用）— 全息色谱，刻意避开蓝/靛 */
export type ResonanceColor = "emerald" | "rose" | "amber" | "fuchsia";

/** 记忆晶体（待解码） */
export interface Crystal {
  id: string;
  tier: CrystalTier;
  /** 解码奖励倍率 */
  value: number;
  createdAt: number;
}

/** 技术分支 */
export type TechBranch = "mining" | "decoding" | "expedition" | "narrative";

/** 技术节点定义 */
export interface TechNode {
  id: string;
  branch: TechBranch;
  level: number;
  name: string;
  desc: string;
  cost: number; // insights
  effect: TechEffect;
}

export interface TechEffect {
  kind:
    | "crystalsPerSec"
    | "crystalCap"
    | "offlineEff"
    | "decodeSteps"
    | "autoDecode"
    | "pulsePower"
    | "contactRate"
    | "insightMult";
  value: number;
}

/** 记忆碎片（叙事） */
export interface Fragment {
  id: string;
  era: number; // 1-5 纪元
  title: string;
  /** 拼出后的回响文本 */
  echo: string;
  /** 解锁所需晶体解码次数门槛 */
  threshold: number;
}

/** 飞升（Prestige）加成 */
export interface PrestigeBonus {
  crystalsPerSecMult: number;
  insightMult: number;
  contactRateMult: number;
}

/** 解码阵列节点 */
export interface DecodeNode {
  id: number;
  row: number;
  col: number;
  color: ResonanceColor;
  used: boolean;
}

/** 解码谜题状态 */
export interface DecodePuzzle {
  tier: CrystalTier;
  grid: DecodeNode[];
  rows: number;
  cols: number;
  /** 目标共振序列（玩家需按此顺序点击同色相邻节点） */
  target: ResonanceColor[];
  /** 已点击节点序列 */
  path: number[];
  stepLimit: number;
  seed: number;
}

/** 完整游戏状态 */
export interface GameState {
  // 资源
  crystals: number;
  insights: number;
  energy: number;
  contact: number; // 0-100 接触进度

  // 产能（由技术树 + 飞升计算缓存）
  crystalsPerSec: number;
  crystalCap: number;
  pulsePower: number;
  offlineEff: number; // 0-1
  insightMult: number;
  contactRateMult: number;
  autoDecode: boolean;

  // 技术
  tech: Record<string, number>; // techId -> level

  // 记忆
  fragments: Record<string, boolean>;
  totalDecoded: number;

  // 飞升
  ascensions: number;
  blueprints: string[];

  // 解码
  pendingCrystals: Crystal[];
  activePuzzle: DecodePuzzle | null;

  // 探险
  activeExpedition: Expedition | null;
  expeditionLog: ExpeditionLogEntry[];
  energyMax: number;
  lastEnergyTick: number;
  totalExpeditions: number;

  // 成就
  achievements: Record<string, boolean>; // achievementId -> unlocked

  // 元
  lastTick: number;
  createdAt: number;
  theme: "dark" | "light";
  soundOn: boolean;
}

// ============ 遗迹探险 (Expedition) 系统 ============

/** 探险节点类型 */
export type ExpeditionNodeType =
  | "combat"
  | "treasure"
  | "choice"
  | "puzzle"
  | "boss"
  | "rest";

/** 探险节点 */
export interface ExpeditionNode {
  id: number;
  type: ExpeditionNodeType;
  /** 事件描述 */
  title: string;
  desc: string;
  /** 该节点是否已被访问 */
  cleared: boolean;
  /** 战斗/解谜的难度（影响胜率/奖励） */
  difficulty: number;
  /** 节点在路径上的位置索引 */
  position: number;
}

/** 探险状态 */
export interface Expedition {
  id: string;
  /** 节点路径（线性，position 0..n） */
  nodes: ExpeditionNode[];
  /** 当前所在节点索引 */
  currentNode: number;
  /** 是否已完成（到达 boss 并结算） */
  finished: boolean;
  /** 本次探险累计奖励 */
  rewards: {
    crystals: number;
    insights: number;
    contact: number;
    fragments: string[];
  };
  /** 探险力（由技术+飞升计算） */
  power: number;
  /** 剩余生命（战斗失败扣减，归零则探险失败结束） */
  hp: number;
  maxHp: number;
  /** 种子（可复现） */
  seed: number;
  startedAt: number;
}

/** 探险日志条目 */
export interface ExpeditionLogEntry {
  expeditionId: string;
  nodeType: ExpeditionNodeType;
  result: string;
  rewards: string;
  timestamp: number;
}

/** 探险事件结算结果 */
export interface ExpeditionResult {
  /** 日志描述 */
  log: string;
  /** 奖励 */
  crystals?: number;
  insights?: number;
  contact?: number;
  fragments?: string[];
  /** 生命变化 */
  hpDelta?: number;
  /** 是否探险结束（失败或完成） */
  ended: boolean;
  /** 结束原因 */
  endReason?: "victory" | "defeat" | "abort";
}
