package com.brilliance.isc.common.taskdistributor.service;

import com.brilliance.isc.bo.Que;
import com.brilliance.isc.bo.TaskDistUser;
import com.brilliance.isc.bo.TaskPoolConfig;
import com.brilliance.isc.common.taskdistributor.request.AssignTaskRequest;
import com.brilliance.isc.common.taskdistributor.response.TaskListResponse;
import com.brilliance.isc.common.vo.BaseRequestPageVo;
import com.brilliance.isc.common.vo.PageVo;

import java.util.Map;
import java.util.Optional;

public interface TaskDistService {

    // 任务入队事件处理
    void handleTaskEnqueue(Que que);

    void handleTaskEnqueue(String queinr);

    void matchPoolAndEnqueue(Que que);

    String getTaskPoolName(TaskPoolConfig config);

    String getUserPoolName(TaskPoolConfig config);

    String getUserPoolName(TaskDistUser user);

    Optional<TaskPoolConfig> matchPool(Que que);

    // 柜员查询已分配给自己的任务（直接查数据库，因为不在redis里）
    TaskListResponse queryTodoList(String usrinr);

    TaskListResponse queryTodoList();

    // 柜员查询可分配给自己的任务（遍历任务池），当前只看是否为同一机构，后续再分组、查询权限（细粒度）
    PageVo<Que> queryAvailableTasks(BaseRequestPageVo page);

    boolean pinTask(String taskId);

    boolean unpinTask(String taskId);

    // 分配任务（将指定ID的任务手动分配给指定ID的柜员）
    Map<String,Integer> manualAssignTasks(AssignTaskRequest req);

    int manualAssignSingleTasks(AssignTaskRequest req);


    // 分配任务（全自动）
    void fullAutoDistribute();

    // 柜员提交任务，解除阈值占用
    void commitTask(String extkey);

    void corToQueue(Que task);

    void corToQueue(AssignTaskRequest request);

    Que getRimCorQue(Que que);

    Que getCorrectAssignQue(Que que);
}
