package com.younike.system.service;

import com.younike.common.core.domain.AjaxResult;
import com.younike.hlpay.dto.PaymentParam;
import com.younike.system.domain.Order;
import com.younike.system.domain.OrderStat;
import com.younike.system.domain.OrderRefund;
import com.younike.system.domain.vo.MemberOrderDetailVo;
import com.younike.system.domain.vo.MemberOrderVo;
import com.younike.system.domain.vo.OrderVo;
import com.younike.hlpay.dto.OrderParam;
import com.younike.system.param.OrderQueryParam;
import com.younike.system.param.OredrRefundParam;

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

/**
 * 订单主Service接口
 *
 * @author elev
 * @date 2022-01-07
 */
public interface IOrderService {

    /**
     * 处理退款
     * @return
     */
    AjaxResult doRefund(OrderRefund orderRefund);
    /**
     * 后台订单列表
     * @param param
     * @return
     */
    List<OrderVo> orderList(OrderQueryParam param);
    /**
     * 查询订单主
     *
     * @param orderId 订单主主键
     * @return 订单主
     */
    Order selectOrderByOrderId(Long orderId);

    /**
     * 查询订单主列表
     *
     * @param order 订单主
     * @return 订单主集合
     */
    List<Order> selectOrderList(Order order);

    /**
     * 新增订单主
     *
     * @param order 订单主
     * @return 结果
     */
    int insertOrder(Order order);

    /**
     * 修改订单主
     *
     * @param order 订单主
     * @return 结果
     */
    int updateOrder(Order order);

    /**
     * 批量删除订单主
     *
     * @param orderIds 需要删除的订单主主键集合
     * @return 结果
     */
    int deleteOrderByOrderIds(Long[] orderIds);

    /**
     * 删除订单主信息
     *
     * @param orderId 订单主主键
     * @return 结果
     */
    int deleteOrderByOrderId(Long orderId);

    int updateOrderCustom(Order order);

    /**
     * 查询近days天的特定订单状态（orderStates）订单列表
     *
     * @param days 天数
     * @param orderStates 订单状态
     * @return 订单列表
     */
    List<OrderStat> listLastOrders(int days, String[] orderStates);

    /**
     * 查询会员端订单分页列表
     *
     * @param order
     * @return
     */
    List<MemberOrderVo> listMemberOrderByOrderState(Order order);

    /**
     * 会员下单
     * @param param
     * @return
     */
    AjaxResult addOrder(OrderParam param);

    /**
     * 查询会员订单详情
     *
     * @param orderId
     * @return
     */
    MemberOrderDetailVo getMemberOrderByOrderId(Long orderId);

    /**
     * 订单支付
     * @param param
     * @return
     */
    AjaxResult editOrder(PaymentParam param);

    /**
     * 取消订单
     * @param param
     * @return
     */
    AjaxResult cancal(OredrRefundParam param);

    /**
     * 申请平台介入（申请退款）
     * @param param
     * @return
     */
    AjaxResult applyForRefund(OredrRefundParam param);

    /**
     * 追加服务
     * @param param
     * @return
     */
    AjaxResult addServer(OrderParam param);


    /**
     * 确认完成
     * @param param
     * @return
     */
    AjaxResult affirm(OredrRefundParam param);

    /**
     * 取消申请平台介入
     * @param param
     * @return
     */
    AjaxResult cancelRefund(OrderParam param);

    /**
     * @param settleDate 结算截止时间
     */
    Map<Long, List<Order>> selectPreSettleOrders(Date settleDate);

    boolean updateBatchById(List<Order> updated);
}
