import axiosInstance from '../utils/axios';

// 作业管理 VO
export interface WorkJobVO {
  id?: number;
  orderNo?: string; // 作业编号
  code?: string; // 作业编号（兼容旧字段）
  name?: string; // 作业名称
  initiatorName?: string; // 发起人
  initiator?: string; // 发起人（兼容旧字段）
  initiationTime?: number | Date; // 发起时间
  initiateTime?: number | Date; // 发起时间（兼容旧字段）
  description?: string; // 作业内容
  content?: string; // 作业内容（兼容旧字段）
  currentNodeId?: string; // 当前节点ID
  currentNode?: string; // 当前节点（兼容旧字段）
  status?: string | number; // 作业状态: pending-待执行, running-执行中, completed-执行完成, rejected-已退回, skipped-已跳过
  [key: string]: any;
}

// 作业管理请求参数
export interface InsertWorkJobParam {
  name: string; // 作业名称（必填）
  content?: string; // 作业内容（可选）
  [key: string]: any;
}

// 作业管理更新参数
export interface UpdateWorkJobParam {
  id: number;
  name?: string;
  content?: string;
  [key: string]: any;
}

// 发起作业参数
export interface InsertWorkflowWorkParam {
  name: string; // 作业名称
  type: string; // 作业分类
  designId: number; // 流程设计ID
  description: string; // 作业内容/描述
  urgencyLevel?: string; // 紧急程度
  [key: string]: any;
}

// 更新作业参数
export interface UpdateWorkflowWorkParam {
  id: number; // 作业ID（必填）
  name: string; // 作业名称
  type: string; // 作业分类
  designId: number; // 流程设计ID
  description: string; // 作业内容/描述
  urgencyLevel?: string; // 紧急程度
  [key: string]: any;
}

// 分页参数类型
export interface PageParam {
  pageNo?: number;
  pageSize?: number;
  name?: string;
  [key: string]: any;
}

// 分页响应类型
export interface PageResponse<T> {
  list: T[];
  total: number;
}

// 作业管理 API
export const workJobApi = {
  // 查询作业列表（分页）
  getWorkJobPage: (params?: PageParam) => {
    return axiosInstance.get<PageResponse<WorkJobVO>>('/iscs/work-job/getWorkJobPage', { params });
  },
  
  // 查询作业详情
  selectWorkJobById: (id: number) => {
    return axiosInstance.get<WorkJobVO>(`/iscs/work-job/selectWorkJobById?id=${id}`);
  },
  
  // 新增作业
  insertWorkJob: (data: InsertWorkJobParam) => {
    return axiosInstance.post<WorkJobVO>('/iscs/work-job/insertWorkJob', data);
  },
  
  // 更新作业
  updateWorkJob: (data: UpdateWorkJobParam) => {
    return axiosInstance.put<WorkJobVO>('/iscs/work-job/updateWorkJob', data);
  },
  
  // 删除作业
  deleteWorkJobList: (ids: number[]) => {
    // 将数组转换为逗号分隔的字符串作为URL参数
    const idsStr = ids.join(',');
    return axiosInstance.delete(`/iscs/work-job/deleteWorkJobList?ids=${idsStr}`);
  },
  
  // 发起作业（创建流程作业）
  insertWorkflowWork: (data: InsertWorkflowWorkParam) => {
    return axiosInstance.post('/iscs/workflow-work/insertWorkflowWork', data);
  },
  
  // 更新作业（更新流程作业）
  updateWorkflowWork: (data: UpdateWorkflowWorkParam) => {
    return axiosInstance.put('/iscs/workflow-work/updateWorkflowWork', data);
  },
  
  // 查询作业列表（分页）
  getWorkflowWorkPage: (params?: PageParam) => {
    return axiosInstance.get<PageResponse<WorkJobVO>>('/iscs/workflow-work/getWorkflowWorkPage', { params });
  },
  
  // 查询作业详情
  selectWorkflowWorkById: (id: number) => {
    return axiosInstance.get<WorkJobVO>(`/iscs/workflow-work/selectWorkflowWorkById?id=${id}`);
  },
  
  // 检查作业（完成流程设置时调用）
  checkWorkById: (id: number) => {
    return axiosInstance.get(`/iscs/workflow-work/checkWorkById?id=${id}`);
  },
  
  // 删除作业列表
  deleteWorkflowWorkList: (ids: number[]) => {
    // 将数组转换为逗号分隔的字符串作为URL参数
    const idsStr = ids.join(',');
    return axiosInstance.delete(`/iscs/workflow-work/deleteWorkflowWorkList?ids=${idsStr}`);
  },
  
  // 更新作业节点（copyDeptIds/copyUserIds 后端要求逗号分隔字符串，禁止 JSON 数组）
  updateWorkflowWorkNode: (data: UpdateWorkflowWorkNodeParam) => {
    const payload: Record<string, unknown> = { ...data };
    const toCommaString = (v: unknown): string => {
      if (Array.isArray(v)) {
        return v.map((x) => String(x).trim()).filter((s) => s !== '').join(',');
      }
      if (v == null || v === '') return '';
      return String(v).trim();
    };
    if ('copyDeptIds' in payload) {
      payload.copyDeptIds = toCommaString(payload.copyDeptIds);
    }
    if ('copyUserIds' in payload) {
      payload.copyUserIds = toCommaString(payload.copyUserIds);
    }
    return axiosInstance.put('/iscs/workflow-work-node/updateWorkflowWorkNode', payload as UpdateWorkflowWorkNodeParam);
  },
  
  // 发布作业
  updateStartWork: (data: UpdateStartWorkParam) => {
    return axiosInstance.post('/iscs/workflow-work/updateStartWork', data);
  },
};

// 更新作业节点参数
export interface UpdateWorkflowWorkNodeParam {
  nodeId: number; // 节点ID（必填）
  nodeName: string; // 节点名称（必填）
  formId?: number; // 业务表单ID
  workerUserId?: number; // 负责人ID
  isolationType?: string; // 隔离方式
  isolationPoints?: string; // 隔离点
  isolationNodeUuid?: string; // 隔离节点UUID（解除隔离节点使用）
  nodeUserDOList?: WorkflowWorkNodeUserDO[]; // 节点设置人员信息列表（上锁人、共锁人）
  /** 上锁人 userId（字符串），从 nodeUserDOList 中 type===jtlocker 的项取 */
  lockPerson?: string;
  /** 共锁人 userId 列表（字符串），从 nodeUserDOList 中 type===jtcolocker 的项取，如 "[181,182]" */
  colockPersons?: string;
  /** 抄送部门 ID，多选时为逗号分隔字符串，如 "1,2,3" */
  copyDeptIds?: string;
  /** 抄送人用户 ID，多选时为逗号分隔字符串，如 "380,381" */
  copyUserIds?: string;
  [key: string]: any;
}

// 作业节点用户信息
export interface WorkflowWorkNodeUserDO {
  userId?: number;
  userName?: string;
  type?: string; // 用户类型：worker, locker, colocker等
  [key: string]: any;
}

// 作业节点数据
export interface WorkflowWorkNodeDO {
  id?: number; // 节点ID
  uuid?: string; // 节点UUID（用于匹配designContent中的节点）
  nodeName?: string; // 节点名称
  nodeIcon?: string; // 节点图标
  type?: string; // 节点类型
  data?: string; // 节点数据（JSON字符串）
  position?: string; // 节点位置（JSON字符串）
  parentUuid?: string; // 父节点UUID
  childrenUuid?: string; // 子节点UUID
  formId?: number; // 表单ID
  isolationType?: string; // 隔离方式
  isolationPoints?: string; // 隔离点
  workerUserId?: number; // 负责人ID
  workerGroupId?: number; // 作业组ID
  lockPerson?: string; // 上锁人员（兼容旧字段）
  notifyUserId?: number; // 通知人员ID
  notifyUserGroupId?: number; // 通知用户组ID
  notifyTime?: string; // 通知时间
  nodeUserList?: WorkflowWorkNodeUserDO[]; // 节点用户列表（包含上锁人、共锁人等）
  [key: string]: any;
}

// 发布作业参数
export interface UpdateStartWorkParam {
  workId: number; // 作业ID（必填）
  startType: string; // 发布方式(0-立即发布 1-定时发布)
  planTime?: string; // 发布时间（定时发布时必填）
  [key: string]: any;
}
