// ==================== 审批引擎响应类型 ====================
// 基于 docs/modules/approval-engine/API.md

// ==================== 通用类型 ====================

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

export interface Attachment {
  id: string;
  name: string;
  url: string;
  size: number;
  mimeType: string;
}

// ==================== 流程启动响应 ====================
// 基于 API.md: POST /start - 启动审批流程

export interface StartApprovalResponse {
  instanceId: string;       // 流程实例 ID
  workflowId: string;       // Temporal 工作流 ID
  workflowRunId: string;    // Temporal 运行 ID
  status: InstanceStatus;   // 流程状态
  currentNodeId?: string;   // 当前节点 ID
  startTime: string;        // 启动时间
}

// ==================== 审批操作响应 ====================
// 基于 API.md: POST /:instanceId/approve 等审批操作

// ⭐ 方案2：API返回完整状态
export interface ApprovalActionResponse {
  success: boolean;
  taskId: string;
  action: string;
  nextNodeId?: string;       // 下一节点 ID（如有）
  isProcessCompleted: boolean;
  
  // ⭐ 新增：流程最新状态（可选，仅 approve/reject 返回）
  instance?: {
    id: string;
    status: InstanceStatus;         // 流程状态
    currentNodeId?: string;         // 当前节点ID
    currentNodeName?: string;       // 当前节点名称
    endTime?: string;               // 结束时间（如果已结束）
    endReason?: string;             // 结束原因
  };
  
  // ⭐ 新增：是否需要刷新列表（可选，流程状态变化时为 true）
  shouldRefreshList?: boolean;
}

// 基于 API.md: POST /:instanceId/withdraw - 发起人撤回
export interface WithdrawResponse {
  success: boolean;
  instanceId: string;
  status: 'WITHDRAWN';  // ⭐ 修复：撤回应该返回 WITHDRAWN 状态
  endReason: 'WITHDRAWN';
}

// ==================== 任务列表响应 ====================

export interface ApprovalTaskItem {
  taskId: string;
  instanceId: string;
  businessType: string;
  businessId: string;
  businessKey: string;
  title: string;
  status: TaskStatus;
  priority: number;
  initiator: UserInfo;
  nodeName: string;
  nodeType: string;
  approvalMode?: ApprovalMode;
  createTime: string;
  dueDate?: string;
  isOverdue: boolean;
  remainingHours?: number;
  
  // 委托信息
  isDelegated: boolean;
  delegatedFrom?: UserInfo;
  delegatedAt?: string;
  delegationReason?: string;
  
  // 催办信息
  lastReminderTime?: string;
  reminderCount?: number;

  // 表单相关字段（从 variables 中提取，仅表单类型审批有值）
  formKey?: string;  // 表单定义的 key
  formDefinitionId?: string;  // 表单定义 ID
  formVersionId?: string;  // 表单版本 ID

  // 业务类型元数据（用于列表显示）
  businessTypeMeta?: {
    displayName: string;  // '表单申请', '采购申请' 等
    icon: string;         // 图标名称
    color: string;        // 主题色
  };

  // 业务摘要（用于列表显示）
  businessSummary?: {
    title: string;
    description?: string;
    amount?: number;
    customFields?: Record<string, any>;
  };
}

export interface PaginatedTasksResponse {
  items: ApprovalTaskItem[];
  total: number;
  page: number;
  limit: number;
  totalPages: number;
  hasNext: boolean;
  hasPrev: boolean;
}

// ==================== 任务详情响应 ====================

// 基于 API.md: GET /tasks/:taskId - 任务详情
export interface TaskDetailResponse {
  id: string;                   // 任务 ID
  name: string;
  description?: string;
  type: TaskType;
  status: TaskStatus;
  
  // 处理人
  assignee?: UserInfo;
  candidateUsers: UserInfo[];
  candidateGroups: string[];
  owner?: UserInfo;             // 原始负责人（转发前）
  
  // 委托信息
  isDelegated: boolean;
  delegatedFrom?: UserInfo;
  delegatedAt?: string;
  delegationReason?: string;
  delegationType?: DelegationType;
  
  // 时间
  createTime: string;
  claimTime?: string;
  dueDate?: string;
  endTime?: string;
  lastReminderTime?: string;
  
  // 超时信息
  isOverdue: boolean;
  remainingHours?: number;
  reminderCount?: number;
  
  // 版本号（用于乐观锁）
  version: number;
  
  // 表单配置
  editableFields?: string[];
  requiredFields?: string[];
  
  // 操作权限
  allowedActions: ApprovalAction[];
  
  // 可退回节点
  returnTargets?: ReturnableNode[];
  
  // 关联信息
  instance: ProcessInstanceDetail;
  nodeInstance: NodeInstanceInfo;
  
  // 操作日志
  actionLogs: ActionLogItem[];
}

export interface ProcessInstanceDetail {
  id: string;
  businessType: string;
  businessId: string;
  businessKey?: string;
  title?: string;
  status: InstanceStatus;
  initiator: UserInfo;
  startTime: string;
}

export interface NodeInstanceInfo {
  id: string;
  nodeId: string;
  nodeName: string;
  nodeType: NodeType;
}

export type TaskType = 'APPROVAL' | 'COUNTERSIGN' | 'OR_SIGN' | 'CC' | 'SEQUENTIAL';

export interface AvailableAction {
  action: ApprovalAction;
  label: string;
  enabled: boolean;
  reason?: string;
}

export interface ReturnableNode {
  nodeId: string;
  nodeName: string;
  nodeType: string;
  executedAt?: string;
}

// ==================== 流程详情响应 ====================
// 基于 API.md: GET /:instanceId - 流程详情

export interface ProcessDetailResponse {
  id: string;                 // 流程实例 ID
  
  // 业务关联
  businessType: string;
  businessId: string;
  businessKey?: string;
  title?: string;
  
  // 流程定义
  processDefinition: {
    id: string;
    key: string;
    name: string;
    category: string;
  };
  processVersion: {
    id: string;
    version: number;
    name: string;
  };
  
  // Temporal 信息
  workflowId: string;
  workflowRunId: string;
  
  // 发起人
  initiator: UserInfo;
  
  // 状态
  status: InstanceStatus;
  currentNodeId?: string;
  currentNodeName?: string;
  
  // 流程变量
  variables: Record<string, any>;
  
  // 执行统计
  totalNodeExecutions: number;
  
  // 时间
  startTime: string;
  endTime?: string;
  
  // 结束信息
  endReason?: string;
  endComment?: string;
  
  // 优先级
  priority: number;
  dueDate?: string;
  
  // 节点实例列表
  nodeInstances: NodeInstanceDetail[];
  
  // 当前待处理任务
  pendingTasks: ApprovalTaskItem[];
}

export interface NodeInstanceDetail {
  id: string;
  nodeId: string;
  nodeName: string;
  nodeType: NodeType;
  status: NodeStatus;
  
  // 审批配置
  assignees: UserInfo[];
  approvalMode?: ApprovalMode;
  
  // 执行信息
  executionCount: number;
  result?: string;
  
  // 时间
  startTime: string;
  endTime?: string;
  
  // 关联任务
  tasks: ApprovalTaskItem[];
}

// ==================== 流程状态响应 ====================
// 基于 API.md: GET /:instanceId/status - 流程状态

export interface ProcessStatusResponse {
  id: string;                   // 流程实例 ID
  status: InstanceStatus;
  currentNodeId?: string;
  currentNodeName?: string;
  currentAssignees: UserInfo[];
  startTime: string;
  endTime?: string;
  endReason?: string;
  progress: number;             // 进度百分比 0-100
}

// ==================== 审批历史响应 ====================

export interface ApprovalHistoryItem {
  id: string;
  nodeId: string;
  nodeName: string;
  nodeType: string;
  action: ApprovalAction;
  operator: UserInfo;
  comment?: string;
  attachments?: Attachment[];
  formDataChanges?: Record<string, any>;
  actionTime: string;
  duration?: number; // 处理时长（秒）
  
  // 特殊操作信息
  targetUser?: UserInfo;
  targetNodeId?: string;
  addSignUsers?: UserInfo[];
  
  // 自动通过标记
  autoApproved?: boolean;
  autoApproveReason?: string;
}

// 基于 API.md: GET /:instanceId/history - 审批历史
export interface ApprovalHistoryResponse {
  items: HistoryItem[];
  status?: InstanceStatus;  // ⭐ 新增：流程实例的最新状态
  endReason?: string;  // ⭐ 新增：流程终止原因（撤回/拒绝/终止时的原因）
}

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;
  
  // 操作日志
  actions: ActionLogItem[];
}

export interface ActionLogItem {
  id: string;
  action: ApprovalAction;
  operator: UserInfo;
  comment?: string;
  actionTime: string;
  formDataChanges?: Record<string, { old: any; new: any }>;
}

export interface TimelineItem {
  nodeId: string;
  nodeName: string;
  nodeType: string;
  status: NodeStatus;
  startTime?: string;
  endTime?: string;
  assignees?: UserInfo[];
  result?: string;
}

// ==================== 流程图数据响应 ====================

export interface DiagramNode {
  id: string;
  type: NodeType;
  name: string;
  status: NodeStatus;
  x: number;
  y: number;
  width: number;
  height: number;
  assignees?: UserInfo[];
  startTime?: string;
  endTime?: string;
  isCurrent: boolean;
}

export interface DiagramEdge {
  id: string;
  source: string;
  target: string;
  label?: string;
  isActive: boolean;
}

export interface DiagramResponse {
  instanceId: string;
  nodes: DiagramNode[];
  edges: DiagramEdge[];
  currentNodeId?: string;
}

// ==================== 催办响应 ====================

export interface RemindResponse {
  success: boolean;
  taskId: string;
  reminderCount: number;
  lastReminderTime: string;
  message: string;
}

export interface BatchRemindResponse {
  total: number;
  success: number;
  failed: number;
  results: RemindResult[];
}

export interface RemindResult {
  taskId: string;
  success: boolean;
  message?: string;
}

// ==================== 流程定义响应 ====================

export interface ProcessDefinitionItem {
  id: string;
  key: string;
  name: string;
  category: string;
  description?: string;
  latestVersion: number;
  status: ProcessStatus;
  organizationId?: string;
  createdAt: string;
  updatedAt: string;
}

export interface ProcessVersionItem {
  id: string;
  version: number;
  name: string;
  status: VersionStatus;
  isDefault: boolean;
  deployedAt?: string;
  deployedBy?: UserInfo;
  changeLog?: string;
  createdAt: string;
}

export interface ProcessVersionDetailResponse extends ProcessVersionItem {
  processModel: Record<string, any>;
  settings: Record<string, any>;
}

// ==================== 管理员操作响应 ====================

export interface AdminActionResponse {
  success: boolean;
  instanceId: string;
  taskId?: string;
  action: AdminAction;
  status?: 'TERMINATED' | 'RUNNING';
  endReason?: 'ADMIN_TERMINATED';
  message: string;
  auditLogId: string;
}

export interface AuditLogItem {
  id: string;
  action: AdminAction;
  riskLevel: RiskLevel;
  operator: UserInfo;
  instanceId: string;
  taskId?: string;
  
  // 业务信息
  businessType: string;
  businessId: string;
  businessKey?: string;
  processTitle?: string;
  
  // 详细信息
  reason: string;
  adminReason?: string;
  comment?: string;
  attachments?: Attachment[];
  
  // 重新分配相关
  originalAssignee?: UserInfo;
  newAssignee?: UserInfo;
  
  // 审计信息
  requestId: string;
  ipAddress: string;
  userAgent: string;
  
  // 时间
  actionTime: string;
}

export interface PaginatedAuditLogsResponse {
  items: AuditLogItem[];
  total: number;
  page: number;
  limit: number;
  totalPages: number;
  hasNext: boolean;
  hasPrev: boolean;
}

// ==================== 统计响应 ====================
// 基于 API.md: GET /my/stats - 审批统计

export interface TaskStatsResponse {
  pendingCount: number;       // 待我处理
  urgentCount: number;        // 紧急待办（即将超时）
  overdueCount: number;       // 已超时
  initiatedCount: number;     // 我发起的（进行中）
  processedToday: number;     // 今日已处理
  processedThisWeek: number;  // 本周已处理
  ccUnreadCount: number;      // 抄送未读
}

// ==================== 管理员数据中心 ====================

export interface AdminAnalyticsResponse {
  summary: {
    totalSubmissions: number;
    approvalRate: number;
    rejectRate: number;
    avgDurationMs: number;
    runningCount: number;
  };
  trends: Array<{
    date: string;
    submissions: number;
    approvals: number;
    rejections: number;
  }>;
  distribution: Array<{
    formKey: string;
    formName: string;
    count: number;
  }>;
}

export interface AdminInstanceItem {
  instanceId?: string;
  businessInstanceId: string;
  businessType: string;
  formKey?: string;
  formName?: string;
  submitter: UserInfo;
  status: string;
  currentNode?: string;
  submittedAt: string;
  durationMs?: number;
  approvalRequired: boolean;
}

export interface AdminInstancesResponse {
  items: AdminInstanceItem[];
  total: number;
  page: number;
  limit: number;
  totalPages: number;
  hasNext: boolean;
  hasPrev: boolean;
}

export interface AdminExportResponse {
  taskId: string;
}

export interface AdminExportItem {
  id: string;
  status: string;
  format: string;
  fileName?: string;
  fileSize?: number;
  contentType?: string;
  downloadUrl?: string;
  createdAt: string;
  completedAt?: string;
  expiresAt?: string;
}

export interface AdminExportStatusResponse extends AdminExportItem {}

export interface AdminSettingsResponse {
  exportRetentionDays: number;
}

// ==================== 枚举类型 ====================

export type InstanceStatus = 'RUNNING' | 'SUSPENDED' | 'APPROVED' | 'REJECTED' | 'WITHDRAWN' | 'TERMINATED' | 'FAILED';

export type TaskStatus = 'CREATED' | 'PENDING' | 'CLAIMED' | 'ASSIGNED' | 'IN_PROGRESS' | 'COMPLETED' | 'CANCELLED' | 'SUSPENDED' | 'WITHDRAWN';

export type NodeStatus = 'PENDING' | 'ACTIVE' | 'COMPLETED' | 'CANCELLED' | 'FAILED' | 'SKIPPED';

export type NodeType = 'START' | 'END' | 'USER_TASK' | 'SERVICE_TASK' | 'GATEWAY' | 'EXCLUSIVE_GATEWAY' | 'PARALLEL_GATEWAY' | 'INCLUSIVE_GATEWAY';

export type ApprovalMode = 'COUNTERSIGN' | 'OR_SIGN' | 'SEQUENTIAL';

export type ApprovalAction =
  | 'SUBMIT'
  | 'APPROVE'
  | 'REJECT'
  | 'RETURN'
  | 'FORWARD'
  | 'WITHDRAW'
  | 'APPROVER_WITHDRAW'
  | 'ADD_SIGN'
  | 'CLAIM'
  | 'UNCLAIM'
  | 'DELEGATE'
  | 'AUTO_APPROVE'
  | 'AUTO_REJECT'
  | 'ESCALATE'
  | 'REMIND'
  | 'EXECUTE'
  | 'COMMENT';

export type AdminAction = 'ADMIN_APPROVE' | 'ADMIN_REJECT' | 'ADMIN_TERMINATE' | 'ADMIN_REASSIGN' | 'ADMIN_RESUME';

export type RiskLevel = 'LOW' | 'MEDIUM' | 'HIGH';

export type DelegationType = 'MANUAL' | 'AUTO_ON_LEAVE' | 'AUTO_TIME_RANGE' | 'AUTO_TIMEOUT';

export type ProcessStatus = 'ACTIVE' | 'SUSPENDED' | 'ARCHIVED';

export type VersionStatus = 'DRAFT' | 'DEPLOYED' | 'SUPERSEDED' | 'ARCHIVED';
