package com.hzs.member.base.service;

import com.hzs.common.domain.activity.draw.ext.AcDrawRewardNumExt;
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.member.account.dto.BusinessCommissionDTO;
import com.hzs.member.base.dto.MemberContinueDTO;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

public interface ICuMemberBusinessService {

    /**
     * 更新用户信息信息
     *
     * @param cuMember 会员
     */
    void updateCuMember(CuMember cuMember);

    /**
     * 修改会员信息，确认订单信息，流水（升级订单、复购订单）
     *
     * @param cuMember           会员信息
     * @param saOrder            订单信息
     * @param cuMemberAccountExt 会员账户信息
     */
    Boolean saveMember(CuMember cuMember, SaOrderExt saOrder, CuMemberAccountExt cuMemberAccountExt);

    /**
     * 保存新会员信息，确认支付订单
     *
     * @param cuMember           会员信息
     * @param saOrder            订单信息
     * @param isPay              是否支付
     * @param cuMemberAccountExt 支付账号
     */
    Boolean saveMember(CuMember cuMember, SaOrderExt saOrder, Boolean isPay, CuMemberAccountExt cuMemberAccountExt);

    /**
     * 保存分享新会员信息，确认支付订单
     *
     * @param cuMember 会员信息
     * @param saOrder  订单信息
     */
    Boolean saveMember(CuMember cuMember, SaOrder saOrder);

    /*
     *  在线支付修改记录
     **/
    Boolean saveMemberOnLineTrade(CuMember cuMember, SaOrder saOrder, CuMemberAccountExt cuMemberAccountExt);

    /**
     * 插入充值记录
     *
     * @param saOrderExt 订单
     */
    CuMemberAccountExt insertMemberRecharge(SaOrder saOrderExt);

    /**
     * 扣款并插入明细
     *
     * @param saOrder         订单
     * @param cuMemberAccount 会员账户
     */
    void insertMemberTrade(SaOrder saOrder, CuMemberAccountExt cuMemberAccount);

    /**
     * 撤销订单，需要更新会员，单点撤单
     *
     * @param pkApprove 审核人
     * @param saOrder   销售订单
     */
    Boolean singleRevokeMemberByRegisterOrder(Long pkApprove, SaOrderExt saOrder, BusinessCommissionDTO businessCommissionDTO);

    /**
     * 自助撤单-注册单撤单
     **/
    Boolean singleRevokeMemberBySelfRevokeOrder(Long pkApprove, SaOrderExt saOrder, BusinessCommissionDTO businessCommissionDTO);

    /**
     * 撤销订单，需要更新会员，合并撤单，直接删除会员
     *
     * @param pkApprove  审核人
     * @param memberList 会员lieb
     * @param saOrderMap 销售订单
     */
    Boolean mergeRevokeMemberByRegisterOrder(Long pkApprove, List<Long> memberList, Map<Long, SaOrderExt> saOrderMap, BusinessCommissionDTO businessCommissionDTO);

    /**
     * 普通撤单，插销除注册专区的订单
     *
     * @param pkApprove 审核人
     * @param saOrder   订单
     * @param cuMember  升级订单
     */
    Boolean normalRevokeOrder(Long pkApprove, SaOrderExt saOrder, CuMember cuMember, List<Long> pkOrderItemList, BusinessCommissionDTO businessCommissionDTO);

    /*
     *  撤销会员账户余额
     **/
    Boolean cancelMemberAccount(Long pkMember, SaOrder saOrder);

    /**
     * 部分撤销订单，回退部分金额，用于部分撤单、调换货退钱
     *
     * @param pkApprove 发起人
     * @param saOrder   订单 backOrderAmount 需要填写回退的金额
     */
    void cancelPartOrderBackAmount(Long pkApprove, SaOrderExt saOrder);

    /**
     * 校验订单调换货物余额是否足够
     *
     * @param saOrder     订单
     * @param updateOrder 新订单
     * @return
     */
    String orderChangeProductPre(SaOrder saOrder, SaOrder updateOrder);

    /**
     * 订单调换货物扣费处理
     *
     * @param saOrder     订单
     * @param updateOrder 新订单
     * @param userId      操作人ID
     * @param obj         追加后续业务实体
     */
    void orderChangeProduct(SaOrder saOrder, SaOrder updateOrder, Long userId, Object obj);

    /**
     * 订单自提退邮费
     *
     * @param pkMember  会员ID
     * @param pkCountry 所属国家
     * @param pkRate    汇率
     * @param postage   邮费
     * @param userId    操作人ID
     * @return
     */
    String orderSelfDeliver(Long pkMember, Integer pkRate, Integer pkCountry, BigDecimal postage, Long userId);

    /*
     * 会员编号，账户类型，抽奖金额
     **/
    Boolean updateCuMemberAccountByDraw(Long pkMember, Integer pkCountry, Integer accountValue, BigDecimal rewardMoney);

    /*
     * 会员抽奖，购买抽奖次数支付金额
     **/
    Boolean updateCuMemberAccountByDraw(CuMemberAccountExt cuMemberAccountExt, BigDecimal payMoney);

    /*
     * 会员抽奖，购买抽奖次数支付金额
     **/
    Boolean updateCuMemberAccountByDraw(Integer payNum, AcDrawRewardNumExt acDrawRewardNumExt);

    /**
     * 更新用户等级
     *
     * @param cuMember   用户信息
     * @param saOrder    订单信息
     * @param pkOldLevel 原等级
     */
    Boolean updateMemberLevel(CuMember cuMember, SaOrder saOrder, Integer pkOldLevel);

    /*
     * 查询会员的安置位置
     **/
    CuMember queryCuMemberPlaceDept(CuMember cuMember, Boolean isFirst, Boolean isFirstAchieve);

    /**
     * 会员续约处理
     *
     * @param memberContinueDTO
     * @return
     */
    String handleMemberContinue(MemberContinueDTO memberContinueDTO);

    /**
     * 订单合单退单
     *
     * @param saOrder 退单订单
     * @param userId  操作用户ID
     * @return
     */
    void orderReturnBatch(SaOrder saOrder, Long userId);


}
