package com.cf.imes.module.executor.dal.mysql.veneer;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cf.imes.module.executor.controller.admin.veneer.vo.UnplannedVeneerPlateDataReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.UnplannedVeneerPlateRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerManageGoodsPageReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerManageGoodsRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerManageOrderPageReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerManageOrderRespVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerManagePlateListReqVO;
import com.cf.imes.module.executor.controller.admin.veneer.vo.VeneerManagePlateRespVO;
import com.cf.imes.module.executor.dal.dataobject.veneer.OrderPlateVeneerDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 贴皮管理 Mapper。
 */
@Mapper
public interface VeneerManageMapper {

    /**
     * 分页查询存在可维护未排单贴皮的根订单 ID。
     *
     * @param page 分页参数
     * @param req 订单查询条件
     * @param orderDateTime 完整订单日期时间范围
     * @return 根订单 ID 分页结果
     */
    IPage<Long> selectRootOrderIdList(@Param("page") IPage<VeneerManageOrderRespVO> page,
                                      @Param("req") VeneerManageOrderPageReqVO req,
                                      @Param("orderDateTime") LocalDateTime[] orderDateTime);

    /**
     * 根据当前页根订单 ID 查询根订单信息。
     *
     * @param page 分页参数
     * @param rootIds 根订单 ID 列表
     * @return 根订单列表
     */
    IPage<VeneerManageOrderRespVO> selectOrderList(@Param("page") IPage<VeneerManageOrderRespVO> page,
                                                    @Param("rootIds") List<Long> rootIds);

    /**
     * 查询当前页根订单下存在可维护未排单贴皮的子订单。
     *
     * @param rootIds 根订单ID列表
     * @param req 订单查询条件
     * @param orderDateTime 完整订单日期时间范围
     * @return 子订单列表
     */
    List<VeneerManageOrderRespVO> selectOrderChildList(
            @Param("rootIds") List<Long> rootIds,
            @Param("req") VeneerManageOrderPageReqVO req,
            @Param("orderDateTime") LocalDateTime[] orderDateTime);

    /**
     * 分页查询存在可维护未排单贴皮的板材。
     *
     * @param page 分页参数
     * @param req 板材查询条件
     * @return 板材分页结果
     */
    IPage<VeneerManageGoodsRespVO> selectGoodsPage(@Param("page") IPage<VeneerManageGoodsRespVO> page,
                                                    @Param("req") VeneerManageGoodsPageReqVO req);

    /**
     * 分页查询存在待排单贴皮的根订单ID。
     *
     * @param page 分页参数
     * @param req 订单查询条件
     * @param orderDateTime 完整订单日期时间范围
     * @return 根订单ID分页结果
     */
    IPage<Long> selectUnplannedRootOrderIdList(
            @Param("page") IPage<VeneerManageOrderRespVO> page,
            @Param("req") VeneerManageOrderPageReqVO req,
            @Param("orderDateTime") LocalDateTime[] orderDateTime);

    /**
     * 查询当前页根订单下存在未排贴皮的子订单。
     *
     * @param rootIds 根订单ID列表
     * @param req 订单查询条件
     * @param orderDateTime 完整订单日期时间范围
     * @return 子订单列表
     */
    List<VeneerManageOrderRespVO> selectUnplannedOrderChildList(
            @Param("rootIds") List<Long> rootIds,
            @Param("req") VeneerManageOrderPageReqVO req,
            @Param("orderDateTime") LocalDateTime[] orderDateTime);

    /**
     * 分页查询存在待排单贴皮的板材。
     *
     * @param page 分页参数
     * @param req 板材查询条件
     * @return 板材分页结果
     */
    IPage<VeneerManageGoodsRespVO> selectUnplannedGoodsPage(
            @Param("page") IPage<VeneerManageGoodsRespVO> page,
            @Param("req") VeneerManageGoodsPageReqVO req);

    /**
     * 按订单查询可维护的未排单板件贴皮列表。
     *
     * @param req 订单、房间及柜体查询条件
     * @return 未排单板件贴皮列表
     */
    List<VeneerManagePlateRespVO> selectOrderPlateList(@Param("req") VeneerManagePlateListReqVO req);

    /**
     * 按板材商品编码查询可维护的未排单板件贴皮列表。
     *
     * @param goodsIds 板材商品编码列表
     * @return 未排单板件贴皮列表
     */
    List<VeneerManagePlateRespVO> selectGoodsPlateList(@Param("goodsIds") List<String> goodsIds);

    /**
     * 按互斥业务范围查询待排单贴皮及其原板件信息。
     * 同一贴皮可能因多个加工组返回多条，由 Service 层合并。
     *
     * @param req 订单或板材范围及房间、柜体筛选条件
     * @return 待排单贴皮及原板件原始列表
     */
    List<UnplannedVeneerPlateRespVO> selectUnplannedPlateList(
            @Param("req") UnplannedVeneerPlateDataReqVO req);

    /**
     * 查询本次已移除的板件贴皮记录。
     *
     * @param ids 板件贴皮记录ID列表
     * @return 已移除板件贴皮记录
     */
    List<OrderPlateVeneerDO> selectRemovedPlateVeneerList(@Param("ids") List<Long> ids);

    /**
     * 批量逻辑删除待排单板件贴皮记录。
     *
     * @param ids 板件贴皮记录ID列表
     * @return 更新行数
     */
    int softDeletePendingPlateVeneer(@Param("ids") List<Long> ids);

    /**
     * 查询原板件下仍然有效的贴皮记录。
     *
     * @param plateIds 原板件ID列表
     * @return 仍存在有效贴皮记录的原板件ID列表
     */
    List<Long> selectRemainingPlateIdList(@Param("plateIds") List<Long> plateIds);

    /**
     * 将已无有效贴皮记录的原板件恢复为未分解状态。
     *
     * @param plateIds 原板件ID列表
     * @return 更新行数
     */
    int restorePlateUndecomposed(@Param("plateIds") List<Long> plateIds);
}
