package com.ghy.order.mapper;

import com.ghy.order.domain.OrderDetail;
import com.ghy.order.domain.OrderDetailCount;
import com.ghy.order.domain.OrderStatusCount;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 细单表(转派后产生的订单)的mapper层
 *
 * @author HH 2022/4/25
 */
public interface OrderDetailMapper {

    /**
     * @param orderDetail 细单表属性
     * @return 成功条数
     */
    int insertOrderDetail(OrderDetail orderDetail);

    /**
     * @param orderDetail 细单表属性
     * @return 成功条数
     */
    int updateOrderDetail(OrderDetail orderDetail);

    /**
     * @param orderDetail 细单表入参
     * @return 细单表集合
     */
    List<OrderDetail> selectOrderDetailList(OrderDetail orderDetail);

    Long countOrderDetailList(OrderDetail orderDetail);

    /**
     * 查询符合条件的子单总数（用于分页）
     *
     * @param orderDetail 查询条件
     * @return 总数
     */
    Long selectOrderDetailCount(OrderDetail orderDetail);

    /**
     * @param orderDetailId 细单表id
     * @return 细单表
     */
    OrderDetail selectById(@Param("orderDetailId") Long orderDetailId);

    /**
     * @param orderMasterId 主订单id
     * @return 详细订单
     */
    List<OrderDetail> selectByOrderMasterId(@Param("orderMasterId") Long orderMasterId);

    /**
     * 根据主订单ID集合批量查询详细订单
     *
     * @param orderMasterIds 主订单ID集合
     * @return 详细订单集合
     */
    List<OrderDetail> selectByOrderMasterIds(@Param("orderMasterIds") List<Long> orderMasterIds);

    /**
     * 批量删除细单表信息
     *
     * @param orderDetailIds 需要删除的数据ID
     * @return 结果
     */
    int deleteOrderDetailByIds(Long[] orderDetailIds);

    /**
     * @param orderDetailCode 细单表编码
     * @return 细单表信息
     */
    OrderDetail checkOrderDetailCodeUnique(String orderDetailCode);

    /**
     * 根据订单id集合信息进行批量数据查询
     *
     * @param orderIdList 订单Id集合信息。
     * @return OrderDetail实体集合信息。
     */
    List<OrderDetail> getByOrderIdList(@Param("orderIdList") List<Long> orderIdList);

    /**
     * 更新子订单状态
     *
     * @param orderDetailId 子订单ID
     * @param orderStatus   状态码
     */
    int updateStatus(@Param("id") Long orderDetailId, @Param("orderStatus") int orderStatus);

    /**
     * 更新子订单超时状态
     *
     * @param id               子订单ID
     * @param timeout          是否超时
     * @param timeoutFineTimes 超时罚款次数
     * @return 1
     */
    int updateTimeout(@Param("id") Long id, @Param("timeout") int timeout, @Param("timeoutFineTimes") int timeoutFineTimes);

    int updateAfterTimeout(@Param("id") Long id, @Param("timeout") int timeout, @Param("timeoutFineTimes") int timeoutFineTimes);

    /**
     * 通过主订单ID批量更新子订单
     * 可更新字段: orderStatus
     *
     * @param orderDetail 子订单
     */
    int updateByOrderMasterId(OrderDetail orderDetail);

    /**
     * 查询指定状态的订单
     */
    List<OrderDetail> selectByStatus(List<Integer> status);

    List<OrderStatusCount> statusCount();

    /**
     * 用提现ID更新订单的提现状态
     *
     * @param drawCashId     发起提现后Adapay返回的对象ID
     * @param drawCashStatus 提现状态见{@link OrderDetail#getDrawCashStatus()}
     * @param drawCashTime   发起提现时间
     * @param arrivalTime    提现到账时间
     * @return 1
     */
    int updateDrawCashStatus(@Param("drawCashId") String drawCashId, @Param("drawCashStatus") int drawCashStatus,
                             @Param("drawCashTime") Date drawCashTime, @Param("arrivalTime") Date arrivalTime);

    int deleteByMaster(Long masterId);

    OrderDetailCount differentStatusOrderCount(OrderDetail orderDetail);

    // 根据开始/结算时间进行查询有效的订单详情数据。
    List<OrderDetail> searchByOrderStartTime(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
}
