import { RobotLifecycleStage } from '@prisma/client';

/**
 * v3 状态转换表 — 来源 docs/modules/robot-manager/business-analysis/最终字段设计.md §9b.1
 *
 * default-deny + 显式 allow：未列入的转换一律拒绝。
 * 含 6 条反向边：
 *   - WAREHOUSE_AT_W1_PDI → RETURNED（PDI 严重问题退供）
 *   - WAREHOUSE_MODIFICATION → WAREHOUSE_AT_W1_PDI（改装失败回检）
 *   - SALES_RESERVED → WAREHOUSE_BRANDED_READY（客户违约回库）
 *   - DELIVERY_APPROVAL → SALES_PAYMENT_VALIDATED（审批文件不全）
 *   - DELIVERY_DELIVERED → RETURNED（D2 7 天内退货）
 *   - AFTERSALES_QUOTE_APPROVAL → DELIVERY_DELIVERED / RETURNED（客户拒绝报价）
 */
export const STAGE_TRANSITIONS: Record<RobotLifecycleStage, RobotLifecycleStage[]> = {
  SUPPLY_PO_CREATED: [RobotLifecycleStage.SUPPLY_IN_PRODUCTION, RobotLifecycleStage.CANCELLED],
  SUPPLY_IN_PRODUCTION: [RobotLifecycleStage.SUPPLY_READY_TO_SHIP, RobotLifecycleStage.CANCELLED],
  SUPPLY_READY_TO_SHIP: [RobotLifecycleStage.LOGISTICS_IN_TRANSIT, RobotLifecycleStage.CANCELLED],
  LOGISTICS_IN_TRANSIT: [
    RobotLifecycleStage.LOGISTICS_BONDED,
    RobotLifecycleStage.LOGISTICS_CUSTOMS_CLEARED,
  ],
  LOGISTICS_BONDED: [RobotLifecycleStage.LOGISTICS_CUSTOMS_CLEARED],
  LOGISTICS_CUSTOMS_CLEARED: [RobotLifecycleStage.WAREHOUSE_RECEIVED],
  WAREHOUSE_RECEIVED: [RobotLifecycleStage.WAREHOUSE_AT_W1_PDI],
  WAREHOUSE_AT_W1_PDI: [
    RobotLifecycleStage.WAREHOUSE_MODIFICATION,
    RobotLifecycleStage.WAREHOUSE_AT_W2_RLE,
    RobotLifecycleStage.WAREHOUSE_AT_W2,
    RobotLifecycleStage.RETURNED, // 反向边：PDI 严重问题退供
  ],
  WAREHOUSE_MODIFICATION: [
    RobotLifecycleStage.WAREHOUSE_AT_W2,
    RobotLifecycleStage.WAREHOUSE_BRANDED_READY,
    RobotLifecycleStage.WAREHOUSE_AT_W1_PDI, // 反向边：改装失败回检
  ],
  WAREHOUSE_AT_W2: [RobotLifecycleStage.WAREHOUSE_BRANDED_READY],
  WAREHOUSE_AT_W2_RLE: [RobotLifecycleStage.WAREHOUSE_BRANDED_READY],
  WAREHOUSE_BRANDED_READY: [RobotLifecycleStage.SALES_RESERVED, RobotLifecycleStage.CANCELLED],
  SALES_RESERVED: [
    RobotLifecycleStage.SALES_PAYMENT_VALIDATED,
    RobotLifecycleStage.CANCELLED,
    RobotLifecycleStage.WAREHOUSE_BRANDED_READY, // 反向边：客户违约取消订单
  ],
  SALES_PAYMENT_VALIDATED: [
    RobotLifecycleStage.DELIVERY_APPROVAL,
    RobotLifecycleStage.DELIVERY_PAYMENT_COLLECTED,
  ],
  DELIVERY_PAYMENT_COLLECTED: [RobotLifecycleStage.DELIVERY_APPROVAL],
  DELIVERY_APPROVAL: [
    RobotLifecycleStage.DELIVERY_READY,
    RobotLifecycleStage.SALES_PAYMENT_VALIDATED, // 反向边：审批文件不全
  ],
  DELIVERY_READY: [RobotLifecycleStage.DELIVERY_DELIVERED],
  DELIVERY_DELIVERED: [
    RobotLifecycleStage.AFTERSALES_TICKET,
    RobotLifecycleStage.RENTAL_ACTIVE,
    RobotLifecycleStage.RETURNED, // 反向边：D2 7 天内退货
    RobotLifecycleStage.CLOSED,
  ],
  RENTAL_ACTIVE: [
    RobotLifecycleStage.AFTERSALES_AT_W6,
    RobotLifecycleStage.AFTERSALES_TICKET,
    RobotLifecycleStage.CLOSED,
  ],
  AFTERSALES_TICKET: [
    RobotLifecycleStage.AFTERSALES_RETURN_INITIATED,
    RobotLifecycleStage.AFTERSALES_UNDER_REPAIR,
    RobotLifecycleStage.DELIVERY_DELIVERED,
    RobotLifecycleStage.RENTAL_ACTIVE,
  ],
  AFTERSALES_RETURN_INITIATED: [RobotLifecycleStage.AFTERSALES_RETURN_RECEIVED],
  AFTERSALES_RETURN_RECEIVED: [RobotLifecycleStage.AFTERSALES_AT_W6],
  AFTERSALES_AT_W6: [
    RobotLifecycleStage.AFTERSALES_UNDER_REPAIR,
    RobotLifecycleStage.AFTERSALES_QUOTE_APPROVAL,
    RobotLifecycleStage.RETURNED,
    RobotLifecycleStage.CLOSED,
  ],
  AFTERSALES_UNDER_REPAIR: [
    RobotLifecycleStage.AFTERSALES_REPAIRED,
    RobotLifecycleStage.AFTERSALES_QUOTE_APPROVAL,
  ],
  AFTERSALES_QUOTE_APPROVAL: [
    RobotLifecycleStage.AFTERSALES_UNDER_REPAIR,
    RobotLifecycleStage.RETURNED, // 反向边：客户拒绝报价（取回）
    RobotLifecycleStage.CLOSED,
    RobotLifecycleStage.DELIVERY_DELIVERED, // 反向边：客户拒绝报价但仍取回（未修）
  ],
  AFTERSALES_REPAIRED: [
    RobotLifecycleStage.DELIVERY_DELIVERED,
    RobotLifecycleStage.WAREHOUSE_BRANDED_READY,
  ],
  CLOSED: [], // 真终态 — 资产退役
  CANCELLED: [
    // 业务单据取消但机器人可复用回库
    RobotLifecycleStage.SUPPLY_READY_TO_SHIP,
    RobotLifecycleStage.WAREHOUSE_BRANDED_READY,
  ],
  RETURNED: [], // 真终态 — 已退给供应商或客户拒收
};

/**
 * 是否允许从 fromStage 直接切到 toStage（不含 guard 检查）
 */
export function isTransitionAllowed(
  fromStage: RobotLifecycleStage,
  toStage: RobotLifecycleStage,
): boolean {
  return (STAGE_TRANSITIONS[fromStage] ?? []).includes(toStage);
}

/**
 * 部门归属（从 stage 前缀派生）— 前端按部门着色 / 分组用
 */
export function stageDepartment(stage: RobotLifecycleStage): string {
  if (stage.startsWith('SUPPLY_')) return 'SUPPLY';
  if (stage.startsWith('LOGISTICS_')) return 'LOGISTICS';
  if (stage.startsWith('WAREHOUSE_')) return 'WAREHOUSE';
  if (stage.startsWith('SALES_')) return 'SALES';
  if (stage.startsWith('DELIVERY_')) return 'DELIVERY';
  if (stage.startsWith('RENTAL_')) return 'RENTAL';
  if (stage.startsWith('AFTERSALES_')) return 'AFTERSALES';
  if (stage === 'CLOSED' || stage === 'CANCELLED' || stage === 'RETURNED') return 'TERMINAL';
  return 'UNKNOWN';
}
