package cn.axzo.workflow.client.feign.manage;

import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
import cn.axzo.workflow.common.annotation.InvokeMode;
import cn.axzo.workflow.common.annotation.Manageable;
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO;
import cn.axzo.workflow.common.model.request.form.instance.FromDataSearchDTO;
import cn.axzo.workflow.common.model.response.form.FormVO;
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
import cn.axzo.workflow.common.model.response.form.instance.FormDataVO;
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
import cn.azxo.framework.common.model.CommonResponse;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;

import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;

/**
 * 表达实例相关 API, 这里主要用于表单与流程的集成所需的 API。
 * <p>
 * 如果想单独创建表单实例，建议在 Form 包中单独提供 API。
 *
 * @author wangli
 * @since 2024-11-11 20:08
 */
@WorkflowEngineFeignClient
public interface FormAdminApi {

    @PostMapping("/api/form/admin/form/page")
    @InvokeMode(SYNC)
    @Manageable
    CommonResponse<List<FormVO>> formPage(@Validated @RequestBody FormSearchDTO dto);

    /**
     * 获取指定审批业务的流程表单设置，
     *
     * @param dto
     * @return
     */
    @PostMapping("/api/form/admin/start/form")
    @InvokeMode(SYNC)
    CommonResponse<FormDefinitionVO> getFormDefinition(@Validated @RequestBody StartFormSearchDTO dto);

    /**
     * 查询指定审批实例的表单模型和数据
     * <p>
     * dto 中的 processInstanceId 与 taskId，至少有一个属性有值，一般建议直接使用实例 ID。
     * 当传入 taskId 时，将只查询该任务绑定的表单模型和数据。
     *
     * @param dto
     * @return
     */
    @PostMapping("/api/form/admin/instance/render")
    @InvokeMode(SYNC)
    CommonResponse<FormInstanceVO> getFormInstance(@Validated @RequestBody FormDetailDTO dto);

    /**
     * 获取指定表单审批的实例数据
     *
     * @param dto
     * @return
     */
    @PostMapping("/api/form/admin/instance/form/data")
    @InvokeMode(SYNC)
    CommonResponse<List<FormDataVO>> getFormData(@Validated @RequestBody FromDataSearchDTO dto);
}
