package cn.edu.whu.boot.allocation.services;

import cn.edu.whu.boot.allocation.entities.TaskCell;
import cn.edu.whu.boot.allocation.entities.TaskCellData;
import cn.edu.whu.boot.allocation.entities.TaskUserCell;
import cn.edu.whu.boot.allocation.entities.TaskUserRole;
import cn.edu.whu.boot.xml.domain.Task;

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

public interface TaskInfoService {
    /**
     * 分配任务时在数据库中更新相关的信息
     *
     * @param cellToData   网格-数据的对应关系
     * @param taskCells    网格的信息
     * @param taskUserCell 外业人员-网格的对应关系
     * @param taskUserRole 外业人员-工作角色的对应关系
     * @param task         任务
     * @param assignedData 审核人员-数据的对应关系
     */
    boolean updateTaskInfo(List<TaskCellData> cellToData,
                           List<TaskCell> taskCells,
                           List<TaskUserCell> taskUserCell,
                           List<TaskUserRole> taskUserRole,
                           Task task,
                           Map<String, Map<Long, Integer>> assignedData);

    /**
     * 修改数据对应的巡查人员
     *
     * @param taskId           任务 ID
     * @param dataToWorker     数据和外业人员的对应关系
     */
    void updateCell2WorkerAndData2Worker(int taskId,
                                         Map<String, Map<Long, Integer>> dataToWorker) throws Exception;

    /**
     * 交换网格后更新数据库
     */
    void updateCell2WorkerAndData2Worker(int taskId,
                                         Map<String, Integer> cellToWorker,
                                         Map<String, Map<Long, Integer>> dataToWorker) throws Exception;

    /**
     * 从任务中移除外业人员后更新 task_user_cell 和 tasK_user_role
     *
     * @param taskId     任务 ID
     * @param userId     需要移除的外业人员的 ID
     * @param isReviewer 是否为审核人员
     */
    void updateUser2RoleAndUser2CellAndUser2Data(int taskId, int userId, boolean isReviewer) throws Exception;

    /**
     * 从网格中删除人员后更新 task_user_cell，
     * 如果是审核人员，还要更新数据-人员
     *
     * @param taskId      任务 ID
     * @param geohash     网格
     * @param userId      采集人员 ID
     * @param isInspector 是否为审核人员
     */
    boolean updateUser2RoleAndUser2CellAndUser2Data(int taskId, String geohash, int userId, boolean isInspector) throws Exception;

    /**
     * 删除任务相关的数据
     *
     * @param taskId 任务 ID
     */
    void deleteTaskInfo(int taskId);

    /**
     * 修改网格内的工作人员后更新数据库
     */
    void completeChangingWorkersInCell(int taskId, String geohash, Collection<Integer> userIds, Map<String, Map<Long, Integer>> assignedData) throws Exception;

    /**
     * 修改任务的外业人员队伍后更新数据库
     */
    void completeChangingWorkers(int taskId,
                                 Map<Integer, Integer> appendWorker2role,
                                 Map<Integer, Integer> deleteWorker2role) throws Exception;

    /**
     * 设置任务是否需要分配
     */
    void setTaskAllocationOptional(int taskId, boolean optional);

    boolean isTaskAllocationOptional(int taskId);
}
