package com.hotwj.platform.flow.service;

import com.hotwj.platform.flow.domain.SysFlowInstance;
import com.hotwj.platform.flow.domain.SysFlowTask;
import com.hotwj.platform.flow.domain.SysFlowTaskHis;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;

import java.util.List;

/**
 * 流程引擎服务接口
 */
public interface ISysFlowService {

    /**
     * 发起流程
     *
     * @param flowCode    流程编码
     * @param businessId  业务ID
     * @param companyId   公司ID
     * @param initiatorId 发起人ID
     * @param approverId  审批人ID (第一步)
     * @return 流程实例ID
     */
    String startFlow(String flowCode, String businessId, Long companyId, String initiatorId, String approverId);

    /**
     * 审批流程
     *
     * @param taskId     任务ID
     * @param pass       是否通过
     * @param comment    审批意见
     * @param auditorId  审核人ID
     */
    void audit(String taskId, boolean pass, String comment, String auditorId);

    /**
     * 获取待办列表
     *
     * @param userId    用户ID
     * @param pageQuery 分页参数
     * @param isRead    是否已读（0-未读, 1-已读）
     * @return 待办列表
     */
    TableDataInfo<SysFlowTask> getTodoList(String userId, PageQuery pageQuery, String isRead);

    /**
     * 获取企业待办列表
     *
     * @param companyId 公司ID
     * @param pageQuery 分页参数
     * @return 待办列表
     */
    TableDataInfo<SysFlowTask> getEnterpriseTodoList(Long companyId, PageQuery pageQuery);

    /**
     * 标记任务已读
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     */
    void readTask(String taskId, String userId);

    /**
     * 获取流程历史
     *
     * @param instanceId 流程实例ID
     * @return 历史记录
     */
    List<SysFlowTaskHis> getHistory(String instanceId);

    /**
     * 获取流程实例详情
     *
     * @param instanceId 流程实例ID
     * @return 流程实例
     */
    SysFlowInstance getInstance(String instanceId);

    /**
     * 判断当前用户是否是当前节点的审批人
     *
     * @param instanceId 流程实例ID
     * @param userId     用户ID
     * @return true/false
     */
    boolean isApprover(String instanceId, String userId);

    /**
     * 获取当前用户的任务ID
     *
     * @param instanceId 流程实例ID
     * @param userId     用户ID
     * @return 任务ID，如果无任务则返回null
     */
    String getTaskId(String instanceId, String userId);

    /**
     * 推送直接待办任务 (不依赖流程定义)
     *
     * @param flowCode   流程编码
     * @param businessId 业务ID
     * @param title      待办标题
     * @param companyId  公司ID
     * @param userId     接收人ID
     * @return 任务ID
     */
    String pushDirectTodo(String flowCode, String businessId, String title, Long companyId, String userId);

    /**
     * 检查是否存在待办任务
     *
     * @param flowCode   流程编码
     * @param businessId 业务ID
     * @param userId     用户ID
     * @return 是否存在
     */
    boolean hasPendingTask(String flowCode, String businessId, String userId);

    /**
     * 删除直接待办任务
     *
     * @param flowCode   流程编码
     * @param businessId 业务ID
     * @param userId     用户ID
     */
    void deleteDirectTodo(String flowCode, String businessId, String userId);

    /**
     * 根据业务ID获取待办任务ID
     *
     * @param flowCode   流程编码
     * @param businessId 业务ID
     * @param userId     用户ID
     * @return 任务ID
     */
    String getTaskIdByBusinessId(String flowCode, String businessId, String userId);

    /**
     * 根据业务ID获取当前活动任务ID（不限定处理人）
     *
     * @param flowCode   流程编码
     * @param businessId 业务ID
     * @return 当前活动任务ID
     */
    String getCurrentTaskIdByBusinessId(String flowCode, String businessId);

    /**
     * 根据任务ID获取任务详情
     *
     * @param taskId 任务ID
     * @return 任务详情
     */
    SysFlowTask getTaskById(String taskId);

    /**
     * 根据任务ID获取流程实例
     *
     * @param taskId 任务ID
     * @return 流程实例
     */
    SysFlowInstance getInstanceByTaskId(String taskId);

    List<String> getApproverIdsByInstance(String instanceId);

    void deleteTodosByInstanceIds(java.util.Collection<String> instanceIds);
}
