/**
 * 审批流程类型定义
 * 
 * 这些类型应该与后端 DTO 保持同步
 * 后端文件: backend/src/engines/approval/dto/approval-response.dto.ts
 */

// ==================== 基础类型 ====================

export interface UserInfo {
  id: string;
  name: string;
  displayName?: string;
  avatar?: string;
}

// ==================== 状态枚举 ====================

/**
 * 节点状态（Node Level）
 * ⚠️ 注意：COMPLETED 表示节点已完成，不代表通过或拒绝
 * 需要通过 actions 中的 action 类型来判断业务结果
 */
export type NodeStatus =
  | 'PENDING'      // 待执行
  | 'ACTIVE'       // 执行中
  | 'ASSIGNED'     // 已分配
  | 'COMPLETED'    // 已完成
  | 'CANCELLED'    // 已取消
  | 'FAILED'       // 失败
  | 'SKIPPED';     // 跳过

/**
 * 任务状态（Task Level）
 */
export type TaskStatus = 
  | 'CREATED' 
  | 'PENDING' 
  | 'CLAIMED' 
  | 'ASSIGNED' 
  | 'IN_PROGRESS' 
  | 'COMPLETED'
  | 'CANCELLED' 
  | 'SUSPENDED' 
  | 'WITHDRAWN';

/**
 * 操作类型（Action Level）
 * ⚠️ 关键：这个决定了业务结果（通过/拒绝/退回等）
 */
export type ApprovalAction =
  // 常规审批操作
  | 'SUBMIT'           // 提交
  | 'APPROVE'          // 通过
  | 'REJECT'           // 拒绝
  | 'RETURN'           // 退回
  | 'WITHDRAW'         // 撤回
  // 流程控制操作
  | 'FORWARD'          // 转交
  | 'APPROVER_WITHDRAW'// 审批人撤销
  | 'ADD_SIGN'         // 加签
  | 'DELEGATE'         // 委托
  | 'ESCALATE'         // 升级
  // 自动操作
  | 'AUTO_APPROVE'     // 自动通过
  | 'AUTO_REJECT'      // 自动拒绝
  // 管理员操作（⭐ 新增）
  | 'ADMIN_APPROVE'    // 管理员代审批通过
  | 'ADMIN_REJECT'     // 管理员代审批拒绝
  | 'ADMIN_REASSIGN'   // 管理员重新分配
  | 'ADMIN_TERMINATE'  // 管理员强制终止
  // 辅助操作
  | 'CLAIM'            // 认领
  | 'UNCLAIM'          // 取消认领
  | 'REMIND'           // 催办
  | 'EXECUTE'          // 执行
  | 'COMMENT';         // 评论

/**
 * 节点类型
 */
export type NodeType = 
  | 'START' 
  | 'END' 
  | 'USER_TASK' 
  | 'SERVICE_TASK' 
  | 'GATEWAY' 
  | 'EXCLUSIVE_GATEWAY' 
  | 'PARALLEL_GATEWAY' 
  | 'INCLUSIVE_GATEWAY';

/**
 * 流程实例状态
 */
export type InstanceStatus =
  | 'RUNNING'
  | 'APPROVED'
  | 'COMPLETED'
  | 'REJECTED'
  | 'WITHDRAWN'
  | 'TERMINATED';

// ==================== 操作类型常量 ====================

/**
 * 操作类型常量，避免魔法字符串
 * 使用示例: if (action.action === ApprovalActionType.REJECT)
 */
export const ApprovalActionType = {
  // 常规审批操作
  SUBMIT: 'SUBMIT' as const,
  APPROVE: 'APPROVE' as const,
  REJECT: 'REJECT' as const,
  RETURN: 'RETURN' as const,
  WITHDRAW: 'WITHDRAW' as const,
  // 流程控制操作
  FORWARD: 'FORWARD' as const,
  APPROVER_WITHDRAW: 'APPROVER_WITHDRAW' as const,
  ADD_SIGN: 'ADD_SIGN' as const,
  DELEGATE: 'DELEGATE' as const,
  ESCALATE: 'ESCALATE' as const,
  // 自动操作
  AUTO_APPROVE: 'AUTO_APPROVE' as const,
  AUTO_REJECT: 'AUTO_REJECT' as const,
  // 管理员操作（⭐ 新增）
  ADMIN_APPROVE: 'ADMIN_APPROVE' as const,
  ADMIN_REJECT: 'ADMIN_REJECT' as const,
  ADMIN_REASSIGN: 'ADMIN_REASSIGN' as const,
  ADMIN_TERMINATE: 'ADMIN_TERMINATE' as const,
  // 辅助操作
  CLAIM: 'CLAIM' as const,
  UNCLAIM: 'UNCLAIM' as const,
  REMIND: 'REMIND' as const,
  EXECUTE: 'EXECUTE' as const,
  COMMENT: 'COMMENT' as const,
};

// ==================== API 响应数据结构 ====================

/**
 * 审批历史响应
 */
export interface ApprovalHistoryResponse {
  items: HistoryItem[];
  status?: InstanceStatus;
}

/**
 * 历史节点项
 */
export interface HistoryItem {
  nodeId: string;
  nodeName: string;
  nodeType: NodeType;
  status: NodeStatus;
  startTime: string;
  endTime?: string;
  tasks: TaskHistoryItem[];
}

/**
 * 任务历史项
 */
export interface TaskHistoryItem {
  id: string;
  assignee?: UserInfo;
  status: TaskStatus;
  autoApproved: boolean;
  autoApproveReason?: string;
  isDelegated?: boolean;
  delegatedFrom?: UserInfo;
  delegationReason?: string;
  actions: ActionLogItem[];
  createdAt?: string;
  assignedAt?: string;
}

/**
 * 操作日志项
 */
export interface ActionLogItem {
  id: string;
  action: ApprovalAction;
  operator: UserInfo;
  targetUser?: UserInfo;
  comment?: string;
  actionTime: string;
  formDataChanges?: Record<string, { old: any; new: any }>;
}

// ==================== 前端显示状态 ====================

/**
 * 节点显示状态（前端使用）
 * 这是根据后端数据映射出来的，用于 UI 展示
 */
export type NodeDisplayStatus = 
  | 'pending'      // 待执行
  | 'active'       // 执行中
  | 'completed'    // 已通过
  | 'rejected'     // 已拒绝
  | 'returned'     // 已退回
  | 'cancelled'    // 已取消（用户撤回）
  | 'terminated'   // 已终止（管理员强制终止）⭐ 新增
  | 'failed'       // 失败（系统错误）
  | 'skipped';     // 跳过

/**
 * 节点状态映射结果
 */
export interface NodeStatusMapping {
  status: NodeDisplayStatus;
  completedAt: string;
  
  /**
   * 操作人/审批人
   * 
   * 语义（零技术债重构 - 2026-01-08）：
   * - 已完成节点（completed/rejected/returned）: 最后一个操作人
   * - ACTIVE节点（无操作记录）: 第一个待审批人
   * - ACTIVE节点（有操作记录）: 最后一个操作人
   * - 会签场景: 使用 pendingApprovals 显示待审批人
   */
  operator: string;
  
  comment: string;
  
  // ⭐ 管理员操作和异常场景标识（扁平化）
  isAdminAction?: boolean;           // 是否为管理员操作
  targetUser?: string;                // 目标用户（用于代审批、重新分配、转交等）
  errorDetails?: string;              // 错误详情（仅 FAILED 状态）
  autoApproveReason?: string;         // 自动审批原因（仅 AUTO_APPROVE/AUTO_REJECT）
  action?: ApprovalAction;           // ⭐ 原始操作类型（用于确定评论前缀）
  
  // ⭐⭐ 已完成的操作记录（零技术债重构 - 2026-01-08，重命名自 allActions）
  /**
   * 节点上已完成的操作记录
   * 用于时间线显示，按时间顺序排列
   * 
   * 使用场景：
   * - 转交 + 审批：显示转交操作和审批操作
   * - 会签（部分完成）：显示已审批的人
   * - 多次转交：显示完整转交链路
   * 
   * @example
   * // 转交 + 审批
   * completedActions: [
   *   { action: 'FORWARD', operator: '王经理', targetUser: '李经理', ... },
   *   { action: 'APPROVE', operator: '李经理', ... }
   * ]
   * 
   * // 会签（部分完成）
   * completedActions: [
   *   { action: 'APPROVE', operator: '王经理', comment: '同意', ... }
   * ]
   */
  completedActions?: Array<{
    id: string;
    action: ApprovalAction;
    operator: UserInfo;
    targetUser?: UserInfo;      // 转交/委托/重新分配的目标人
    comment?: string;            // 操作意见/原因
    actionTime: string;          // 操作时间
  }>;
  
  // ⭐⭐⭐ 待审批的任务（零技术债重构 - 2026-01-08 新增）
  /**
   * 当前待审批的任务列表
   * 仅在 ACTIVE 状态下有值
   * 
   * 使用场景：
   * - 会签场景：显示所有待审批的人
   * - 单人审批：通常不需要此字段（用 operator 即可）
   * 
   * @example
   * // 会签场景（王经理已审批，李经理和赵总监待审批）
   * completedActions: [
   *   { action: 'APPROVE', operator: '王经理', ... }
   * ]
   * pendingApprovals: [
   *   { assignee: '李经理', taskId: 'task-123', ... },
   *   { assignee: '赵总监', taskId: 'task-456', ... }
   * ]
   */
  pendingApprovals?: Array<{
    taskId: string;             // 任务ID
    assignee: UserInfo;         // 待审批人
    assignedAt: string;         // 分配时间
  }>;
}

/**
 * 操作显示元数据
 * 用于定义每种操作类型的显示规则
 */
export interface ActionDisplayMeta {
  icon: string;                      // 图标（Unicode 或 Emoji）
  iconColor: string;                 // 图标颜色（Tailwind 类名，如 'text-green-600'）
  label: string;                     // 显示标签（需要国际化 key）
  labelColor: string;                // 标签颜色（Tailwind 类名，如 'bg-green-100 text-green-700'）
  showInTimeline: boolean;           // 是否在主时间线显示
  requiresTargetUser: boolean;       // 是否需要目标用户信息
  requiresComment: boolean;          // 是否必须填写备注
  isAdminAction: boolean;            // 是否为管理员操作
  isAutoAction: boolean;             // 是否为自动操作
  priority: number;                  // 优先级（用于多操作排序，数字越大优先级越高）
}

/**
 * 操作元数据映射表类型
 */
export type ActionMetadataMap = Record<ApprovalAction, ActionDisplayMeta>;

// ==================== 重新导出 ====================
// 从 designer/types 重新导出，方便集中引用
export type { ProcessModel, ProcessNode, ProcessEdge } from '@/features/approval/designer/types';
