import axios from "@/utils/request";
const baseURL = import.meta.env.VITE_APP_BASE_PROCESS_API;
/**
 * @description 获取流程图列表
 * @param {Object} data - 查询参数对象
 * @param {string} [data.firstResult] - 起始索引
 * @param {string} [data.maxResults] - 最大结果数
 * @param {boolean} [data.latestVersion] - 是否最新版本
 * @returns {Promise} 返回流程图列表数据
 */
export const getProcessList = ({
  firstResult = 0,
  maxResults = 8,
  latestVersion = true,
}) => {
  return axios.request({
    baseURL: baseURL,
    url: "/engine-rest/process-definition",
    method: "get",
    params: {
      firstResult,
      maxResults,
      latestVersion,
    },
    dataType: "json",
  });
};
/**
 * @description 获取流程图信息
 * @param {string} processId - 流程图ID
 * @returns {Promise} 返回流程图信息数据
 */
export const getProcessInfo = (processId) => {
  return axios.request({
    baseURL: baseURL,
    url: `/engine-rest/process-definition/${processId}`,
    method: "get",
    dataType: "json",
  });
};
/**
 * @description 获取流程图xml
 * @param {string} processId - 流程图ID
 * @returns {Promise} 返回流程图xml数据
 */
export const getProcessXml = (processId) => {
  return axios.request({
    baseURL: baseURL,
    url: `/engine-rest/process-definition/${processId}/xml`,
    method: "get",
    dataType: "json",
  });
};

/**
 * @description 上传流程图
 * @param {FormData} data - 流程图数据
 * @param {Blob} [data.content] - 流程图文件  formData.append('content', bpmnBlob, 'process.bpmn');    // 文件名应以 .bpmn 结尾
 * @returns {Promise} 返回上传结果
 */
export const addModeler = (data) => {
  return axios.request({
    baseURL,
    url: "/engine-rest/deployment/create",
    headers: {
      "Content-Type": "multipart/form-data",
    },
    method: "post",
    data: data,
    dataType: "json",
  });
};

/**
 * @description 删除流程图
 * @param {string} processId - 流程图ID
 * @returns {Promise} 返回删除结果
 */
export const deleteProcess = (processId) => {
  return axios.request({
    baseURL: baseURL,
    url: `/engine-rest/process-definition/${processId}`,
    method: "delete",
    dataType: "json",
  });
};

/**
 * @description 创建流程实例
 * @param {object} data
 * @param {string} data.processKey - 流程图key
 * @param {string} data.formId - 表单ID
 * @param {string} data.createUser - 创建人
 * @param {object} data.formValues - 填写的表单数据
 * @returns {Promise} 返回创建结果
 */
export const start = (data) => {
  return axios.request({
    baseURL: baseURL,
    url: `/start`,
    method: "post",
    data: data,
    dataType: "json",
  });
};

//------instance

/**
 * @description 获取流程实例列表
 * @param {Object} data - 查询参数对象
 * @param {string} [data.firstResult] - 起始索引
 * @param {string} [data.maxResults] - 最大结果数
 * @param {string} [data.processDefinitionKey] - 流程图key
 * @param {string} [data.sortOrder] - 排序方式  asc/desc
 * @param {string} [data.sortBy] - 排序字段  startTime
 * @returns {Promise} 返回流程图实例列表数据
 */
export const getProcessInstanceList = ({
  firstResult = 0,
  maxResults = 8,
  processDefinitionKey,
  sortOrder = "desc",
  sortBy = "startTime",
}) => {
  return axios.request({
    baseURL: baseURL,
    url: "/engine-rest/history/process-instance",
    method: "get",
    params: {
      firstResult,
      maxResults,
      processDefinitionKey,
      sortOrder,
      sortBy,
    },
    dataType: "json",
  });
};

/**
 * @description 删除流程实例
 * @param {string} processInstanceId - 流程实例ID
 * @returns {Promise} 返回删除结果
 */

export const deleteProcessInstance = (processInstanceId) => {
  return axios.request({
    baseURL: baseURL,
    url: `/engine-rest/process-instance/${processInstanceId}`,
    method: "delete",
    // data: arg,
    dataType: "json",
  });
};

///TASK----------
/**
 * @description 获取流程实例下的任务
 * @param {Object} data - 查询参数对象
 * @param {string} [data.firstResult] - 起始索引
 * @param {string} [data.maxResults] - 最大结果数
 * @param {string} [data.processInstanceId] - 流程实例ID
 * @returns {Promise} 返回任务列表数据
 */
export const getInstanceTaskList = ({
  firstResult = 0,
  maxResults = 8,
  processInstanceId,
}) => {
  return axios.request({
    baseURL: baseURL,
    url: "/engine-rest/history/task",
    method: "get",
    params: {
      firstResult,
      maxResults,
      processInstanceId,
    },
    dataType: "json",
  });
};
/**
 * @description 查询任务节点候选人/组
 * @param {string} taskId - 任务ID
 * @returns {Promise} 返回任务候选人/组数据
 */
export const getTaskCandidate = (taskId) => {
  return axios.request({
    baseURL: baseURL,
    url: `/engine-rest/task/${taskId}/identity-links`,
    method: "get",
    dataType: "json",
  });
};
/**
 * @description 添加节点候选人/组
 * @param {object} data
 * @param {string} data.taskId - 任务ID
 * @param {string} data.type - 类型 candidate，assignee
 * @param {string} data.userId - 用户ID（二选一）
 * @param {string} data.groupId - 组ID（二选一）
 * @returns {Promise} 返回添加结果
 */
export const addTaskCandidate = (data) => {
  return axios.request({
    baseURL: baseURL,
    url: `/engine-rest/task/${taskId}/identity-links`,
    method: "post",
    data: data,
    dataType: "json",
  });
};

/**
 * @description 删除节点候选人/组
 * @param {object} data
 * @param {string} data.taskId - 任务ID
 * @param {string} data.type - 类型 candidate，assignee
 * @param {string} data.userId - 用户ID（二选一）
 * @param {string} data.groupId - 组ID（二选一）
 * @returns {Promise} 返回删除结果
 */
export const deleteTaskCandidate = (data) => {
  return axios.request({
    baseURL: baseURL,
    url: `/engine-rest/task/${data.taskId}/identity-links/delete`,
    method: "post",
    data: data,
    dataType: "json",
  });
};

/**
 * @description 获取任务列表
 * @param {Object} data - 查询参数对象
 * @param {string} [data.firstResult] - 起始索引
 * @param {string} [data.maxResults] - 最大结果数
 * @param {string} [data.assignee] - 执行人ID
 * @param {string} [data.candidateUser] - 候选人ID（二选一）
 * @param {string} [data.candidateGroup] - 候选组ID（二选一）
 * @returns {Promise} 返回任务列表数据
 */
export const getUserTaskList = ({
  firstResult = 0,
  maxResults = 8,
  assignee,
  candidateUser,
  candidateGroup,
}) => {
  return axios.request({
    baseURL: baseURL,
    url: "/engine-rest/task",
    method: "get",
    params: {
      firstResult,
      maxResults,
      assignee,
      candidateUser,
      candidateGroup,
    },
    dataType: "json",
  });
};
/**
 * @description 认领任务
 * @param {object} data
 * @param {string} data.taskId - 任务ID
 * @param {string} data.userId - 用户ID
 * @returns {Promise} 返回认领结果
 */

export const claim = (data) => {
  return axios.request({
    baseURL: baseURL,
    url: `/engine-rest/task/${data.taskId}/claim`,
    method: "post",
    data: data,
    dataType: "json",
  });
};
/**
 * @description 取消任务执行人
 * @param {string} taskId - 任务ID
 * @returns {Promise} 返回取消结果
 */
// 取消任务执行人:
export const unclaim = (taskId) => {
  return axios.request({
    baseURL: baseURL,
    url: `/engine-rest/task/${taskId}/unclaim`,
    method: "post",
    dataType: "json",
  });
};
/**
 * @description 完成任务
 * @param {Object} data - 包含任务完成相关信息的对象参数，具体结构如下：
 * @param {string} data.taskId - 任务ID，用于唯一标识需要完成的具体任务，是一个字符串类型的值，通常由系统分配并在任务流转过程中传递使用。
 * @param {Object} data.variables - 任务变量对象，用于携带任务执行过程中涉及的各类变量信息，其内部包含具体的业务相关变量，结构如下：
 * @param {Object} data.variables.approvalResult - 与审批结果相关的变量对象，用于传递审批相关信息，包含以下属性：
 * @param {"approved" | "rejected"} data.variables.approvalResult.value - 审批结果，取值为 'approved' 表示审批通过，'rejected' 表示审批未通过，类型为字符串。
 * @param {"String"} data.variables.approvalResult.type - 变量类型标识，此处固定为 'String'，表明审批结果变量的数据类型是字符串类型，用于系统在处理变量时进行类型校验等操作。
 * @returns {Promise} 返回完成结果
 */
export const complete = (data) => {
  return axios.request({
    baseURL: baseURL,
    url: `/engine-rest/task/${data.taskId}/complete`,
    method: "post",
    data: {
      variables: data.variables,
    },
    dataType: "json",
  });
};
/**
 * @description 创建评论--自定义任务执行结果变量
 * @param {object} data
 * @param {string} data.taskId - 任务ID
 * @param {json} data.message - 评论内容-json字符串
 * @returns {Promise} 返回创建结果
 */
export const setComment = (data) => {
  return axios.request({
    baseURL: baseURL,
    url: `/engine-rest/task/${data.taskId}/comment/create`,
    method: "post",
    data: data,
    dataType: "json",
  });
};

//-Form----------

/**
 * @description 获取流程表单列表
 * @param {object} data
 * @param {string} [data.page] - 页码
 * @param {string} [data.start] - 起始索引
 * @param {string} [data.limit] - 最大结果数
 * @returns {Promise} 返回流程表单列表数据
 */
export const getFormList = (data) => {
  return axios.request({
    baseURL: baseURL,
    url: "/form",
    method: "get",
    params: data,
    dataType: "json",
  });
};
/**
 * @description 获取流程表单详情
 * @param {string} formId
 * @returns {Promise} 返回流程表单详情数据
 */
export const getFormDetail = (formId) => {
  return axios.request({
    baseURL: baseURL,
    url: `/form/${formId}`,
    method: "get",
    dataType: "json",
  });
};
/**
 * @description 获取流程表单字段
 * @param {string} path
 * @returns {Promise} 返回流程表单字段数据
 */
export const getFormFields = (path) => {
  return axios.request({
    baseURL: baseURL,
    url: `/form/fields`,
    method: "get",
    params: {
      path,
    },
    dataType: "json",
  });
};

/**
 * @description 添加流程表单
 * @param {object} data
 * @param {string} data.formName - 表单名称
 * @param {string} data.formDesc - 表单描述
 * @param {string} data.formPath - 表单内容
 * @param {string} data.userId - 创建人ID
 * @returns {Promise} 返回添加结果
 */
export const addForm = (data) => {
  return axios.request({
    baseURL: baseURL,
    url: "/form",
    method: "post",
    data: data,
    dataType: "json",
  });
};
/**
 * @description 修改流程表单
 * @param {object} data
 * @param {string} data.id - 表单ID
 * @param {string} data.formName - 表单名称
 * @param {string} data.formDesc - 表单描述
 * @param {string} data.formPath - 表单内容
 * @returns {Promise} 返回修改结果
 */
export const updateForm = (data) => {
  return axios.request({
    baseURL: baseURL,
    url: "/form",
    method: "put",
    data: data,
    dataType: "json",
  });
};

/**
 * @description 删除流程表单
 * @param {string} formId
 * @returns {Promise} 返回删除结果
 */
// 删除数据:
export const deleteForm = (formId) => {
  return axios.request({
    baseURL: baseURL,
    url: "/form/" + formId,
    method: "delete",
    dataType: "json",
  });
};
