package com.ghy.order.service;

import com.ghy.common.core.domain.AjaxResult;
import com.ghy.order.domain.OrderMaster;
import com.ghy.order.domain.OrderMasterCount;
import com.ghy.order.pojo.dto.OrderMasterStatisticsDTO;
import com.ghy.order.request.AppOrderRequest;
import com.ghy.order.request.OrderChangePriceReq;
import com.huifu.adapay.core.exception.BaseAdaPayException;
import com.ghy.order.domain.OrderDetail;

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

/**
 * 主订单接口
 *
 * @author clunt
 */
public interface OrderMasterService {

    String createOrderCode();

    OrderMaster createMasterOrder(AppOrderRequest appOrderRequest);

    /**
     * @param orderMaster 主订单属性
     * @return 成功条数
     */
    int insertOrderMaster(OrderMaster orderMaster);

    /**
     * @param orderMaster 主订单属性
     * @return 成功条数
     */
    int updateOrderMaster(OrderMaster orderMaster);

    /**
     * @param orderMaster 主订单入参
     * @return 主订单集合
     */
    List<OrderMaster> selectOrderMasterList(OrderMaster orderMaster);

    /**
     * @param orderMaster 主订单入参
     * @return 满足条件的主单单量
     */
    Long countOrderMasterList(OrderMaster orderMaster);

    /**
     * 查询符合条件的主单总数
     *
     * @param orderMaster 主订单入参
     * @return 符合条件的主单总数
     */
    Long selectOrderMasterCount(OrderMaster orderMaster);

    /**
     * @param orderMasterId 主订单id
     * @return 主订单
     */
    OrderMaster selectById(Long orderMasterId);

    /**
     * 用 OrderMaster 查询主订单信息
     *
     * @param orderMasterCode 主订单code
     * @return 主订单信息
     */
    OrderMaster selectByCode(String orderMasterCode);

    /**
     * @param ids 主订单ids
     * @return 删除结果
     */
    int deleteOrderMasterByIds(String ids);

    /**
     * 校验主订单编码是否重复
     *
     * @param orderMaster 主订单属性
     * @return 校验结果 1存在 0不存在
     */
    String checkOrderMasterCodeUnique(OrderMaster orderMaster);

    /**
     * 修改主订单状态
     *
     * @param orderMasterId 主订单ID
     * @param status        主订单状态码
     * @return 0失败 1成功
     */
    int updateStatus(Long orderMasterId, int status);

    /**
     * 主订单完成
     * 由定时器触发 而不是由用户触发（用户只能对子订单操作完成）
     * 当所有的子订单完成后 定时器进入此方法
     * 1.修改主订单状态
     * 2.对提成、分销、罚款、手续费等类型的财务单分销和提现
     *
     * @param orderMasterId 主订单ID
     */
    void finish(Long orderMasterId) throws BaseAdaPayException;

    /**
     * 消费者申请取消主订单
     *
     * @param orderMasterId 主订单ID
     */
    void applyForCancel(Long orderMasterId) throws BaseAdaPayException;

    /**
     * 师傅同意取消主订单
     *
     * @param orderMasterId 主订单ID
     * @param agree         0=不同意 1=同意
     */
    void cancelAgree(Long orderMasterId, Integer agree);

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

    /**
     * 查询出未完成(orderStatus < 5)的主订单
     *
     * @return 主订单
     */
    List<OrderMaster> selectUnfinished();

    List<OrderMaster> selectByIds(Collection<Long> masterIds);

    int updatePayStatus(Long orderMasterId, Integer payStatus);

    /**
     * 退款成功时 退款回调接口里会调用这个方法
     *
     * @param reverseId 退款ID
     */
    void refundSucceeded(String reverseId);

    /**
     * 判断是否全部派单
     *
     * @param orderMasterId 主订单ID
     * @return true/false
     */
    boolean isAllAssign(Long orderMasterId);

    /**
     * 更新主订单超时状态
     *
     * @param id      主订单ID
     * @param timeout 是否超时
     * @return 1
     */
    int updateTimeout(Long id, int timeout);

    int updateCreateTime(Long id);

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

    /**
     * 移除主订单的师傅ID
     *
     * @param id 主订单ID
     * @return 1
     */
    int removeWorker(Long id);

    int reject(OrderMaster orderMaster);

    OrderMasterCount differentStatusOrderCount(OrderMaster orderMaster);

    /**
     * @param changePriceReq 批量改价
     */
    AjaxResult batchChangePrice(OrderChangePriceReq changePriceReq);

    // 订单主表数据统计返回 每次都统计全表  数据量比较小
    OrderMasterStatisticsDTO orderStatisticsReturn();

    // 订单主表数据统计返回 每次都统计全表  数据量比较小
    OrderMasterStatisticsDTO orderStatisticsDispose();

    // 订单主表数据统计返回 根据时间统计当前日期天
    OrderMasterStatisticsDTO orderStatisticsReturnByNow();

    // 订单主表数据统计返回 根据时间统计当前日期天
    OrderMasterStatisticsDTO orderStatisticsDisposeByNow();

    int updateOrderMasterAddressById(OrderMaster orderMaster);

    int returnOrder(Long orderMasterId, String returnReason, String returnReasonDetail, String returnImages);

    /**
     * 保存主单师傅备注
     *
     * @param orderMasterId 主订单ID
     * @param workerRemark 师傅备注
     * @return 成功条数
     */
    int saveMasterWorkerRemark(Long orderMasterId, String workerRemark);

    /**
     * 根据商品主单ID查询服务主单
     *
     * @param goodsOrderMasterId 商品主单ID
     * @return 服务主单
     */
    OrderMaster selectByGoodsOrderMasterId(Long goodsOrderMasterId);

}
