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

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

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

/**
 * 审批检查服务接口
 *
 * @author airport-system
 */
public interface ICheckApprovalService {

    /**
     * 启动个人级别检查审批流程
     *
     * @param requestData 请求数据，包含checkType、location、targetUserIds、formData等
     * @param userId      当前用户ID
     * @param username    当前用户名
     * @param remark      备注
     * @return ApprovalInstance 审批实例
     * @throws Exception 启动流程失败时抛出异常
     */
    ApprovalInstance submitPersonalCheck(Map<String, Object> requestData, Long userId, String username, String remark) throws Exception;

    /**
     * 启动科级检查审批流程
     *
     * @param requestData 请求数据，包含checkType、severity、targetDeptId、sectionLeaderId、formData等
     * @param userId      当前用户ID
     * @param username    当前用户名
     * @param remark      备注
     * @return ApprovalInstance 审批实例
     * @throws Exception 启动流程失败时抛出异常
     */
    ApprovalInstance submitSectionCheck(Map<String, Object> requestData, Long userId, String username, String remark) throws Exception;

    /**
     * 启动大队级检查审批流程
     *
     * @param requestData 请求数据，包含checkType、severity、targetDeptId、sectionLeaderId、formData等
     * @param userId      当前用户ID
     * @param username    当前用户名
     * @param remark      备注
     * @return ApprovalInstance 审批实例
     * @throws Exception 启动流程失败时抛出异常
     */
    ApprovalInstance submitBrigadeCheck(Map<String, Object> requestData, Long userId, String username, String remark) throws Exception;

    /**
     * 启动班组级检查审批流程
     *
     * @param requestData 请求数据，包含checkType、severity、groupLeaderId、formData等
     * @param userId      当前用户ID
     * @param username    当前用户名
     * @param remark      备注
     * @return ApprovalInstance 审批实例
     * @throws Exception 启动流程失败时抛出异常
     */
    ApprovalInstance submitGroupCheck(Map<String, Object> requestData, Long userId, String username, String remark) throws Exception;

    /**
     * 启动查获上报审批流程
     *
     * @param requestData 请求数据，包含seizureTime、passengerInfo、formData等
     * @param userId      当前用户ID
     * @param username    当前用户名
     * @param remark      备注
     * @return ApprovalInstance 审批实例
     * @throws Exception 启动流程失败时抛出异常
     */
    ApprovalInstance submitSeizureReport(Map<String, Object> requestData, Long userId, String username, String remark) throws Exception;

    /**
     * 审批任务（同意）
     *
     * @param taskId   任务ID
     * @param comment  审批意见
     * @param formData 表单数据（科长节点需要选择班组等）
     * @param userId   当前用户ID
     * @param username 当前用户名
     * @return ApprovalTask 处理后的任务
     * @throws Exception 审批失败时抛出异常
     */
    ApprovalTask approveTask(Long taskId, String comment, Map<String, Object> formData, Long userId, String username) throws Exception;

    /**
     * 审批任务（驳回）
     *
     * @param taskId   任务ID
     * @param comment  驳回原因
     * @param userId   当前用户ID
     * @param username 当前用户名
     * @return ApprovalTask 处理后的任务
     * @throws Exception 驳回失败时抛出异常
     */
    ApprovalTask rejectTask(Long taskId, String comment, Long userId, String username) throws Exception;

    /**
     * 获取用户待办任务列表
     *
     * @param userId 用户ID
     * @return List<ApprovalTask> 待办任务列表
     * @throws Exception 查询失败时抛出异常
     */
    List<ApprovalTask> getPendingTasks(Long userId) throws Exception;

    /**
     * 获取用户已办任务列表
     *
     * @param userId 用户ID
     * @return List<ApprovalTask> 已办任务列表
     * @throws Exception 查询失败时抛出异常
     */
    List<ApprovalTask> getCompletedTasks(Long userId) throws Exception;

    /**
     * 获取用户发起的审批实例列表
     *
     * @param userId 用户ID
     * @param status 状态筛选（可为空）
     * @return List<ApprovalInstance> 审批实例列表
     * @throws Exception 查询失败时抛出异常
     */
    List<ApprovalInstance> getSubmittedInstances(Long userId, String status) throws Exception;

    /**
     * 获取用户待办任务数量
     *
     * @param userId 用户ID
     * @return Long 待办任务数量
     * @throws Exception 查询失败时抛出异常
     */
    Long getPendingTaskCount(Long userId) throws Exception;

    /**
     * 获取用户抄送列表详情
     *
     * @param userId 用户ID
     * @return List 抄送详情列表
     * @throws Exception 查询失败时抛出异常
     */
    List<com.sundot.airport.system.domain.approval.dto.ApprovalCcDetailDTO> getCcDetailsByUserId(Long userId) throws Exception;

    /**
     * 根据实例ID获取审批历史
     *
     * @param instanceId 审批实例ID
     * @return List<ApprovalHistory> 审批历史列表
     * @throws Exception 查询失败时抛出异常
     */
    List<com.sundot.airport.system.domain.approval.ApprovalHistory> getApprovalHistoryByInstanceId(Long instanceId) throws Exception;

    /**
     * 根据任务ID获取审批历史
     *
     * @param taskId 任务ID
     * @return List<ApprovalHistory> 审批历史列表
     * @throws Exception 查询失败时抛出异常
     */
    List<com.sundot.airport.system.domain.approval.ApprovalHistory> getApprovalHistoryByTaskId(Long taskId) throws Exception;

    /**
     * 获取用户的审批历史记录
     *
     * @param userId 用户ID
     * @param action 操作类型（可为空，如：SUBMIT, APPROVE, REJECT, CANCEL）
     * @return List<ApprovalHistory> 审批历史列表
     * @throws Exception 查询失败时抛出异常
     */
    List<com.sundot.airport.system.domain.approval.ApprovalHistory> getUserApprovalHistory(Long userId, String action) throws Exception;

    /**
     * 批量更新审批抄送已读状态
     *
     * @param ids 需要更新的ID列表
     * @return 影响行数
     * @throws Exception 更新失败时抛出异常
     */
    int batchUpdateCcReadStatus(List<Long> ids) throws Exception;
}