/**
 * 技術開発ツリー。
 *
 * 開発室に猫を割り当てると研究ポイント(RP)が貯まり、ツリーのノードを開発できる。
 * 開発すると、扱える機械・素材・製品・電力設備が増えていく。
 * 最初から使えるのは基本的なライン設備だけで、あとは全部この先にある。
 */
import type { TileKind } from './types';

export type TechId =
  // ライン設備
  | 'logistics'
  | 'buffering'
  | 'automation'
  // 加工技術
  | 'machining'
  | 'pressing'
  | 'robotics'
  | 'packaging'
  // 構内物流
  | 'palletizing'
  | 'forklift'
  | 'shipping_dock'
  // 素材・製品
  | 'alloy'
  | 'electronics'
  | 'aerospace'
  // エネルギー
  | 'power_grid'
  | 'generator'
  | 'solar';

export interface TechNode {
  id: TechId;
  label: string;
  /** ツリー上の列 (0が左端)。UIの並びにだけ使う。 */
  column: number;
  /** 前提となる開発 */
  requires: TechId[];
  /** 必要な研究ポイント */
  cost: number;
  /** 解禁される建設物 */
  unlocksBuild: TileKind[];
  /** 解禁される素材グレード (0は初期から利用可) */
  unlocksMaterial?: number;
  /** 解禁されるその他の操作 */
  unlocksAction?: 'stack';
  desc: string;
}

export const TECHS: TechNode[] = [
  // --- ライン設備 ---
  {
    id: 'logistics', label: '構内物流の基礎', column: 0, requires: [], cost: 40,
    unlocksBuild: ['splitter', 'merger'],
    desc: '分岐機と合流機を解禁する。1本の幹線を複数の系統へ分けられるようになる。',
  },
  {
    id: 'buffering', label: '工程間バッファ理論', column: 1, requires: ['logistics'], cost: 70,
    unlocksBuild: ['stocker'], unlocksAction: 'stack',
    desc: '一時保管ストッカーと、ストッカー・パレットの段積みを解禁する。',
  },
  {
    id: 'automation', label: '自動化制御', column: 2, requires: ['buffering', 'machining'], cost: 180,
    unlocksBuild: [],
    desc: 'ロボット制御の前提となる基礎技術。それ自体は設備を解禁しない。',
  },

  // --- 加工技術 ---
  {
    id: 'machining', label: '切削加工', column: 0, requires: [], cost: 60,
    unlocksBuild: ['lathe'],
    desc: '旋盤を解禁する。作業台より速いが、巻き込まれの労災が起きる。',
  },
  {
    id: 'pressing', label: '塑性加工', column: 1, requires: ['machining'], cost: 110,
    unlocksBuild: ['press'],
    desc: 'プレス機を解禁する。精度が高く、精密な製品づくりに必要になる。',
  },
  {
    id: 'robotics', label: '産業用ロボット', column: 3, requires: ['automation'], cost: 260,
    unlocksBuild: ['robot'],
    desc: 'アームロボットを解禁する。猫の割り当てが要らず、精度も速度も高い。',
  },
  {
    id: 'packaging', label: '梱包工程', column: 1, requires: ['logistics'], cost: 90,
    unlocksBuild: ['packer'],
    desc: '梱包機を解禁する。通した完成品は単価が2割上がる。',
  },

  // --- 構内物流 ---
  {
    id: 'palletizing', label: 'パレチゼーション', column: 2, requires: ['packaging'], cost: 140,
    unlocksBuild: ['pallet', 'container'],
    desc: 'パレット置き場と大型コンテナを解禁する。製品をまとめて扱えるようになる。',
  },
  {
    id: 'forklift', label: '構内車両の導入', column: 3, requires: ['palletizing'], cost: 200,
    unlocksBuild: ['forkdepot'],
    desc: 'フォークリフト詰所を解禁する。走行通路の確保が新しい課題になる。',
  },
  {
    id: 'shipping_dock', label: '出荷バース整備', column: 4, requires: ['forklift'], cost: 240,
    unlocksBuild: ['dock'],
    desc: 'トラックバースを解禁する。まとめ出荷で単価が25%上がる。',
  },

  // --- 素材と製品 ---
  {
    id: 'alloy', label: '合金材の取り扱い', column: 2, requires: ['pressing'], cost: 160,
    unlocksBuild: [], unlocksMaterial: 1,
    desc: '合金材を調達できるようになる。工程は増えるが精密部品として高く売れる。',
  },
  {
    id: 'electronics', label: '電子部品の製造', column: 3, requires: ['alloy', 'automation'], cost: 300,
    unlocksBuild: [], unlocksMaterial: 2,
    desc: '電子基板材を調達できるようになる。精密機械を通さないと不良になる。',
  },
  {
    id: 'aerospace', label: '航空宇宙品質', column: 4, requires: ['electronics', 'robotics'], cost: 520,
    unlocksBuild: [], unlocksMaterial: 3,
    desc: '特殊合金材を調達できるようになる。宇宙船部品はこの素材からしか作れない。',
  },

  // --- エネルギー ---
  {
    id: 'power_grid', label: '受電設備の増強', column: 0, requires: [], cost: 50,
    unlocksBuild: [],
    desc: '系統からの契約電力が +8 される。設備を増やす前に、まずここから。',
  },
  {
    id: 'generator', label: '自家発電', column: 1, requires: ['power_grid'], cost: 150,
    unlocksBuild: ['generator'],
    desc: 'ディーゼル発電機を解禁する。燃料費は定額なので、大電力ほど得になる。',
  },
  {
    id: 'solar', label: '太陽光発電', column: 2, requires: ['generator'], cost: 280,
    unlocksBuild: ['solar'],
    desc: '太陽光パネルを解禁する。燃料はいらないが、その日の天候で出力が変わる。',
  },
];

export const TECH_BY_ID: Record<TechId, TechNode> = Object.fromEntries(
  TECHS.map((t) => [t.id, t]),
) as Record<TechId, TechNode>;

/** 開発しなくても最初から置ける建設物 */
export const STARTER_BUILDS: TileKind[] = [
  'conveyor',
  'bench',
  'basket',
  'handler_post',
  'rest',
  'breakroom',
  'office',
  'lab',
  'litter',
  'scratch',
  'feeder',
  'box',
  'wall',
  'floor',
  'pole',
];

export interface MaterialDef {
  grade: number;
  label: string;
  /** 完成させるのに必要な加工回数 */
  stages: number;
  /** 出荷までに必要な精度の合計 */
  precision: number;
  /** 1個あたりの調達費 */
  cost: number;
  /** 完成品の名前 */
  product: string;
  /** 完成品の基準単価 */
  price: number;
}

/**
 * 素材と製品。グレードが上がるほど工程数と必要精度が増えるが、単価は跳ね上がる。
 * 精度は機械ごとの加工精度の合計で、プレス機やロボットを通さないと足りなくなる。
 */
export const MATERIALS: MaterialDef[] = [
  { grade: 0, label: '鉄材', stages: 2, precision: 0, cost: 0, product: '単純部品', price: 1400 },
  { grade: 1, label: '合金材', stages: 3, precision: 4, cost: 420, product: '精密部品', price: 3400 },
  { grade: 2, label: '電子基板材', stages: 4, precision: 8, cost: 1250, product: '電子部品', price: 7200 },
  { grade: 3, label: '特殊合金材', stages: 5, precision: 13, cost: 3100, product: '宇宙船部品', price: 15500 },
];

/** 開発室1ティックあたりの研究ポイント (集中力・記憶力で増減する) */
export const RESEARCH_RATE = 0.010;
