package com.sundot.airport.system.service.approval;

import java.util.List;
import java.util.Map;

import com.sundot.airport.system.domain.approval.ApprovalInstance;
import com.sundot.airport.system.domain.approval.ApprovalTask;

/**
 * 审批流程引擎Service接口
 *
 * @author simon lin
 * @date 2025-09-06
 */
public interface IApprovalEngineService {
    /**
     * 启动审批流程
     *
     * @param workflowCode  流程代码
     * @param businessType  业务类型
     * @param businessId    业务ID
     * @param title         审批标题
     * @param submitterId   提交人ID
     * @param submitterName 提交人姓名
     * @param formData      表单数据
     * @param businessData  业务数据
     * @return 审批实例
     */
    ApprovalInstance startProcess(String workflowCode, String businessType, Long businessId,
                                  String title, Long submitterId, String submitterName,
                                  Map<String, Object> formData, Map<String, Object> businessData);

    /**
     * 审批任务（同意）
     *
     * @param taskId       任务ID
     * @param operatorId   操作人ID
     * @param operatorName 操作人姓名
     * @param comment      审批意见
     * @param formData     表单数据
     * @return 结果
     */
    boolean approveTask(Long taskId, Long operatorId, String operatorName, String comment, Map<String, Object> formData);

    /**
     * 驳回任务
     *
     * @param taskId       任务ID
     * @param operatorId   操作人ID
     * @param operatorName 操作人姓名
     * @param comment      驳回理由
     * @return 结果
     */
    boolean rejectTask(Long taskId, Long operatorId, String operatorName, String comment);

    /**
     * 取消审批流程
     *
     * @param instanceId   实例ID
     * @param operatorId   操作人ID
     * @param operatorName 操作人姓名
     * @param comment      取消理由
     * @return 结果
     */
    boolean cancelProcess(Long instanceId, Long operatorId, String operatorName, String comment);

    /**
     * 获取用户待办任务列表
     *
     * @param userId 用户ID
     * @return 待办任务列表
     */
    List<ApprovalTask> getUserPendingTasks(Long userId);

    /**
     * 获取用户已办任务列表
     *
     * @param userId 用户ID
     * @return 已办任务列表
     */
    List<ApprovalTask> getUserCompletedTasks(Long userId);

    /**
     * 获取用户发起的审批实例列表
     *
     * @param userId 用户ID
     * @param status 状态
     * @return 审批实例列表
     */
    List<ApprovalInstance> getUserSubmittedInstances(Long userId, String status);

    /**
     * 根据业务类型和级别获取对应的流程代码
     *
     * @param businessType  业务类型
     * @param level         级别
     * @param submitterRole 提交人角色
     * @return 流程代码
     */
    String getWorkflowCodeByBusinessAndLevel(String businessType, String level, String submitterRole);

    /**
     * 个人级别审批流程（发送通知确认）
     *
     * @param businessType  业务类型
     * @param businessId    业务ID
     * @param title         标题
     * @param submitterId   提交人ID
     * @param submitterName 提交人姓名
     * @param targetUserIds 目标用户ID列表
     * @param formData      表单数据
     * @param businessData  业务数据
     * @return 审批实例
     */
    ApprovalInstance startPersonalLevelProcess(String businessType, Long businessId, String title,
                                               Long submitterId, String submitterName, Long sectionLeaderId,
                                               Map<String, Object> formData, Map<String, Object> businessData);

    /**
     * 科级审批流程
     *
     * @param businessType    业务类型
     * @param businessId      业务ID
     * @param title           标题
     * @param submitterId     提交人ID
     * @param submitterName   提交人姓名
     * @param sectionLeaderId 科长ID
     * @param formData        表单数据
     * @param businessData    业务数据
     * @return 审批实例
     */
    ApprovalInstance startSectionLevelProcess(String businessType, Long businessId, String title,
                                              Long submitterId, String submitterName, Long sectionLeaderId,
                                              Map<String, Object> formData, Map<String, Object> businessData);

    /**
     * 大队级审批流程
     *
     * @param businessType    业务类型
     * @param businessId      业务ID
     * @param title           标题
     * @param submitterId     提交人ID
     * @param submitterName   提交人姓名
     * @param sectionLeaderId 责任人ID（大队行政人员）
     * @param formData        表单数据
     * @param businessData    业务数据
     * @return 审批实例
     */
    ApprovalInstance startBrigadeLevelProcess(String businessType, Long businessId, String title,
                                              Long submitterId, String submitterName, Long sectionLeaderId,
                                              Map<String, Object> formData, Map<String, Object> businessData);

    /**
     * 班组级审批流程
     *
     * @param businessType  业务类型
     * @param businessId    业务ID
     * @param title         标题
     * @param submitterId   提交人ID
     * @param submitterName 提交人姓名
     * @param formData      表单数据
     * @param businessData  业务数据
     * @return 审批实例
     */
    ApprovalInstance startGroupLevelProcess(String businessType, Long businessId, String title,
                                            Long submitterId, String submitterName,
                                            Map<String, Object> formData, Map<String, Object> businessData);

    /**
     * 查获上报审批流程
     *
     * @param businessType  业务类型
     * @param businessId    业务ID
     * @param title         标题
     * @param submitterId   提交人ID
     * @param submitterName 提交人姓名
     * @param submitterRole 提交人角色
     * @param formData      表单数据
     * @param businessData  业务数据
     * @return 审批实例
     */
    ApprovalInstance startSeizureReportProcess(String businessType, Long businessId, String title,
                                               Long submitterId, String submitterName, String submitterRole,
                                               Map<String, Object> formData, Map<String, Object> businessData);

    /**
     * 批量审批任务（同意）
     *
     * @param ids 任务ID列表
     * @return 批量结果
     */
    boolean approveTaskList(List<Long> ids);

    /**
     * 批量审批任务（驳回）
     *
     * @param ids 任务ID列表
     * @return 批量结果
     */
    boolean rejectTaskList(List<Long> ids);
}