package com.hzs.retail.sale.controller.service;

import com.hzs.common.core.domain.R;
import com.hzs.common.domain.member.base.CuMember;
import com.hzs.common.domain.member.ext.CuMemberAccountExt;
import com.hzs.common.domain.sale.ext.SaOrderExt;
import com.hzs.common.domain.sale.order.SaOrder;
import com.hzs.common.domain.sale.order.SaOrderItems;
import com.hzs.common.domain.system.config.BdGrade;
import com.hzs.retail.sale.param.RetailOrderOtherParam;
import com.hzs.retail.sale.param.RetailOrderParam;
import com.hzs.retail.sale.param.RetailOrderRegisterParam;
import com.hzs.retail.sale.param.RetailOrderUpgradeParam;
import com.hzs.system.base.dto.CurrencyDTO;

import java.util.List;

/**
 * 新零售订单服务
 */
public interface IRetailOrderService {

    /**
     * 确认注册订单
     *
     * @param registerParam 注册订单入参
     * @param gradeList     等级列表（可为空）
     * @return
     */
    String confirmRegOrder(RetailOrderRegisterParam registerParam, List<BdGrade> gradeList);

    /**
     * 确认升级订单
     *
     * @param upgradeParam 升级订单入参
     * @return
     */
    String confirmUpgOrder(RetailOrderUpgradeParam upgradeParam);

    /**
     * 确认其它订单
     *
     * @param orderParam 订单入参
     * @return
     */
    String confirmOtherOrder(RetailOrderOtherParam orderParam);

    /**
     * 封装订单信息
     *
     * @param orderParam 订单入参
     * @param gradeList  等级列表
     * @param cuMember   新会员信息
     * @return
     */
    SaOrderExt createSaOrder(RetailOrderParam orderParam, List<BdGrade> gradeList, CuMember cuMember);

    /**
     * 封装订单明细（计算邮费）
     *
     * @param orderParam 订单入参（邮费返回）
     * @param gradeList  等级列表 -- 可为null
     * @param cuMember   会员信息（注册可为空）
     * @param saOrderExt 订单信息 -- 可为null
     * @param currency   汇率 -- 可为null
     * @return
     */
    List<SaOrderItems> createSaOrderItems(RetailOrderParam orderParam, List<BdGrade> gradeList,
                                          CuMember cuMember, SaOrderExt saOrderExt, CurrencyDTO currency);

    /**
     * 查询会员账户
     *
     * @param pkMember 会员ID
     * @return
     */
    CuMemberAccountExt getMemberAccount(Long pkMember);

    /**
     * 校验会员账户
     *
     * @param pkMember 会员ID
     * @param payPwd   支付密码
     * @return
     */
    R<CuMemberAccountExt> validMemberAccount(Long pkMember, String payPwd);

    /**
     * 封装会员信息
     *
     * @param orderParam 订单参数
     * @return
     */
    CuMember packageCuMember(RetailOrderParam orderParam);

    /**
     * 支付注册订单
     *
     * @param saOrderExt       订单信息
     * @param newMember        新会员
     * @param memberAccountExt 支付会员账户
     * @return
     */
    String payRegOrder(SaOrderExt saOrderExt, CuMember newMember, CuMemberAccountExt memberAccountExt);

    /**
     * 支付升级订单
     *
     * @param saOrderExt        订单信息
     * @param updateGradeMember 升级会员
     * @param memberAccountExt  支付会员账户
     * @return
     */
    String payUpgOrder(SaOrderExt saOrderExt, CuMember updateGradeMember, CuMemberAccountExt memberAccountExt);

    /**
     * 支付其它订单
     *
     * @param saOrderExt       订单信息
     * @param buyMember        购买会员
     * @param memberAccountExt 支付会员账户
     * @return
     */
    String payOtherOrder(SaOrderExt saOrderExt, CuMember buyMember, CuMemberAccountExt memberAccountExt);

    /**
     * 在线支付订单
     *
     * @param pkMember  会员ID
     * @param orderCode 订单编号
     * @return
     */
    String onlinePaymentCallBack(Long pkMember, String orderCode);

    /**
     * 保存提货订单
     *
     * @param saOrder          订单
     * @param saOrderItemsList 订单明细
     * @return
     */
    Long savePickOrder(SaOrder saOrder, List<SaOrderItems> saOrderItemsList);

}
