package cn.iocoder.yudao.module.mes.service.task;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskDetailRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.task.vo.TaskSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.plan.PlanDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.task.TaskDetailDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.task.ViewTaskProductSummary;

import javax.validation.Valid;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 生产任务单 Service 接口
 *
 * @author 内蒙必硕
 */
public interface TaskService {

    /**
     * 创建生产任务单
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createTask(@Valid TaskSaveReqVO createReqVO);

    /**
     * 更新生产任务单
     *
     * @param updateReqVO 更新信息
     */
    void updateTask(@Valid TaskSaveReqVO updateReqVO);
    int updateTask(TaskDO taskDO);
    /**
     * 删除生产任务单
     *
     * @param id 编号
     */
    void deleteTask(Long id);

    /**
     * 获得生产任务单
     *
     * @param id 编号
     * @return 生产任务单
     */
    TaskDO getTask(Long id);

    /**
     * 获得用户 Map
     *
     * @param ids 用户编号数组
     * @return 用户 Map
     */
    default Map<Long, TaskDO> getMap(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return new HashMap<>();
        }
        return CollectionUtils.convertMap(getTaskList(ids), TaskDO::getId);
    }

    List<TaskDO> getTaskList(Collection<Long> ids);

    /**
     * 获得生产任务单分页
     *
     * @param pageReqVO 分页查询
     * @return 生产任务单分页
     */
    PageResult<TaskDO> getTaskPage(TaskPageReqVO pageReqVO);

    /**
     * 获得生产任务单分页
     *
     * @param pageReqVO 分页查询
     * @return 生产任务单分页
     */
    PageResult<TaskDO> getTaskPage2(TaskPageReqVO pageReqVO);

    // ==================== 子表（生产任务单明细） ====================
    List<TaskDO> selectList(List<Integer> status);

    /**
     * 获得生产任务单明细列表
     *
     * @param taskId task ID
     * @return 生产任务单明细列表
     */
    List<TaskDetailDO> getTaskDetailListByTaskId(Long taskId);
    List<TaskDetailRespVO> buildDetailVOList(List<TaskDetailDO> list);
    /**
     * 获得生产任务单明细分页
     *
     * @param pageReqVO 分页查询
     * @param taskId    task ID
     * @return 生产任务单明细分页
     */
    PageResult<TaskDetailRespVO> getTaskDetailPage(PageParam pageReqVO, Long taskId);

    //产品汇总
    List<ViewTaskProductSummary> getTaskProductSummaryList(Long taskId);

    /**
     * 创建生产任务单明细
     *
     * @param taskDetail 创建信息
     * @return 编号
     */
    Long createTaskDetail(@Valid TaskDetailDO taskDetail);

    /**
     * 更新生产任务单明细
     *
     * @param taskDetail 更新信息
     */
    void updateTaskDetail(@Valid TaskDetailDO taskDetail);

    /**
     * 删除生产任务单明细
     *
     * @param id 编号
     */
    void deleteTaskDetail(Long id);

    /**
     * 获得生产任务单明细
     *
     * @param id 编号
     * @return 生产任务单明细
     */
    TaskDetailDO getTaskDetail(Long id);

    /**
     * 根据生产任务单以及选定明细，生成生产计划
     *
     * @param taskId         任务单编号
     * @param sizeOfPlan     生成的计划数
     * @param productsOfPlan 每个计划的产品数
     * @return 生产任务单明细
     */
    Map<Long, List<PlanDO>> generatePlan(Long taskId, int sizeOfPlan, int productsOfPlan);

    /**
     * 根据任务单id，产品id，产品总数，计划数量，每个计划产品数生成planDO
     *
     * @param taskId         任务id
     * @param productId      产品id
     * @param totalNumber    产品总数
     * @param productsOfPlan 每个计划多少个产品
     * @return
     */
    List<PlanDO> generatePlan2(Long taskId, Long productId, Long totalNumber, int productsOfPlan);

  /**
 * 根据任务单明细id，产品id，产品总数，计划数量，每个计划产品数生成planDO
 * */
    List<PlanDO> generatePlan3(Long taskId,Long taskDetailId, Long productId, Long totalNumber, int productsOfPlan);
}