package com.hzs.member.base;

import com.hzs.common.core.domain.R;
import com.hzs.common.domain.activity.draw.ext.AcDrawRewardNumExt;
import com.hzs.common.domain.member.base.CuMember;
import com.hzs.common.domain.member.base.CuMemberRegister;
import com.hzs.common.domain.member.base.CuMemberShare;
import com.hzs.common.domain.member.ext.CuMemberAccountExt;
import com.hzs.common.domain.member.ext.CuMemberExt;
import com.hzs.common.domain.member.swing.ext.CuMemberSwingNetExt;
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.LoginMember;
import com.hzs.member.base.dto.MemberContinueDTO;
import com.hzs.member.base.dto.ShowWaresDTO;
import com.hzs.member.base.dto.ZeroElementRevokeDTO;
import com.hzs.member.handlebusiness.dto.AnalysisBusinessAppealParam;

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

/**
 * 会员服务接口
 */
public interface IMemberServiceApi {

    /**
     * 通过会员编号查询会员信息
     *
     * @param memberCode 会员编号
     * @return 结果
     */
    R<LoginMember> getMemberInfo(String memberCode);

    /**
     * 通过会员编码查询分享会员信息
     *
     * @param memberCode 会员编号
     * @return
     */
    R<LoginMember> getShareMemberInfo(String memberCode);

    /**
     * 根据会员ID获取会员信息（查库）
     *
     * @param memberId
     * @return
     */
    R<CuMemberExt> getMemberById(Long memberId);

    /**
     * 根据会员编号获取会员信息（查库）
     *
     * @param memberCode
     * @return
     */
    R<CuMemberExt> getMemberByCode(String memberCode);

    /**
     * 前台查询会员的方法，通过传输不同的参数，查询不同的会员
     *
     * @param cuMember 会员编号的传输值
     */
    R<List<CuMemberExt>> getMemberInfo(CuMember cuMember);

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

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

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

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

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

    /**
     * 查找安置人伞上会员信息
     *
     * @param memberId 编号、安置人
     */
    R<List<CuMemberExt>> querySponsorOnUmbrella(Long memberId, String memberCode, String phone);

    /**
     * 查找安置人伞上会员信息
     *
     * @param memberId 编号、安置人
     */
    R<List<CuMemberExt>> querySponsorOnUmbrella(Long memberId, List<String> memberCodeList);

    /**
     * 查找安置人伞下
     *
     * @param memberId 会员编号
     */
    R<List<CuMemberExt>> selectPlaceSponsorUnderUmbrellaByCondition(Long memberId, List<CuMemberExt> cuMemberExtList);

    /**
     * 查找安置人伞下
     *
     * @param memberId 安置人，编号
     */
    R<List<CuMemberExt>> queryPlaceSponsorUnderUmbrella(Long memberId, String... placeParent);

    /**
     * 根据会员编号，查找该会员编号极左极下的那个人
     *
     * @param memberId  会员编号
     * @param placeDept 1代表左区极左极下，2代表右区极左极下
     */
    R<CuMemberExt> queryPlaceSponsorLastLeft(Long memberId, Integer placeDept);

    /**
     * 获取会员缓存
     *
     * @param memberCode 编号
     * @return CuMember
     */
    R<CuMember> getMember(String memberCode);

    /**
     * 获取会员缓存
     *
     * @param pkMember 会员主键
     * @return CuMember
     */
    R<CuMember> getMember(Long pkMember);

    /**
     * 获取会员缓存
     *
     * @param memberCode 会员编号
     * @return CuMember
     */
    R<CuMember> queryMember(String memberCode);

    /**
     * 查询会员
     */
    R<CuMember> queryMember(Long pkMember);

    /**
     * 保存新会员信息,待支付订单
     *
     * @param cuMember 会员信息
     */
    R<Boolean> saveMember(CuMember cuMember);

    /**
     * 查询网体是否存在推荐人
     */
    R<Integer> queryCuMemberByPkMember(Long pkReference);

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

    /**
     * 修改会员信息，确认订单信息，流水（升级订单、复购订单）
     *
     * @param cuMember 会员信息
     * @param saOrder  订单信息
     */
    R<Boolean> saveMember(CuMember cuMember, SaOrder saOrder);

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

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

    /**
     * 处理新会员，生成主键，跟会员编号
     *
     * @param cuMember 会员
     * @param isHaiFun 是否嗨粉
     */
    R<CuMember> createMemberIdAndCode(CuMember cuMember, Boolean isHaiFun);

    /**
     * 创建注册会员编号（放入会员编号批次占用）
     *
     * @param cuMember 会员信息
     */
    R<CuMember> createRegisterMemberCode(CuMember cuMember);

    /**
     * 创建空单注册会员
     *
     * @param member
     */
    R<CuMember> createEmptyOrderMember(CuMemberExt member);

    /**
     * 校验会员下的安置人、推荐人是否存在
     *
     * @param pkMember 会员ID
     */
    R<Boolean> checkLowerMember(Long pkMember);

    /**
     * 取消用户（取消注册相关订单，同步取消用户）
     *
     * @param pkMember
     */
    R<Boolean> cancelMember(Long pkMember);

    /**
     * 根据会员ID列表查询会员
     *
     * @param pkMemberList 会员ID列表 -- 必传
     * @param pkCountry    国家ID -- 非必传
     */
    R<List<CuMemberExt>> findMemberByMemberId(List<Long> pkMemberList, Integer pkCountry);

    /**
     * 查询分享会员
     *
     * @param pkMember 主键
     */
    R<CuMemberShare> queryCuMemberShare(Long pkMember);

    /**
     * 根据会员主键查询会员注册信息
     *
     * @param pkMember 会员主键
     */
    R<CuMemberRegister> queryCuMemberRegister(Long pkMember);

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

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

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

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

    /**
     * 校验是否血缘关系（返回true则有血缘关系）
     *
     * @param topCode 顶点编号
     * @param userId  当前会员
     */
    R<Boolean> checkParent(String topCode, Long userId);

    /**
     * 查询会员是否在血缘下（批量）
     *
     * @param topCodeList 顶点编号列表
     * @param userId      当前会员
     */
    R<CuMemberExt> checkMemberByParentList(List<String> topCodeList, Long userId);

    /**
     * 获取奖衔的翻译KEY值
     **/
    Integer getAwardsTranslateValue(Integer pkCountry, Integer pkId);

    /**
     * 查询全部
     *
     * @return
     */
    R<List<CuMemberExt>> findAll();

    /**
     * 校验商品团队信息是否可见
     *
     * @param showWaresDTOS
     */
    R<Map<Integer, Boolean>> checkIsShowWares(List<ShowWaresDTO> showWaresDTOS);

    /**
     * 查询安置位置错误
     *
     * @return List<CuMemberExt>
     */
    R<List<CuMemberExt>> queryPlaceErrorCode();

    /**
     * 清除会员编号占用数据
     *
     * @return
     */
    R<Integer> clearMemberEmptyCode();

    /**
     * 查询伞下会员
     */
    R<Boolean> queryCuMemberUnderUmbrella(Long pkMember);

    /**
     * 零元撤单签呈列表
     **/
    R<List<ZeroElementRevokeDTO>> zeroByBusinessList(AnalysisBusinessAppealParam analysisBusinessAppealParam);

    /**
     * 校验是否安置关系
     *
     * @param topCode  顶点编号
     * @param pkMember 当前会员
     */
    R<Boolean> checkPlaceParent(String topCode, Long pkMember);

    /*
     *  查询系统中所有甩网数据
     **/
    R<List<CuMemberSwingNetExt>> queryCuMemberSwingNetExt();

    /**
     * 处理会员续约
     *
     * @param userId    当前用户
     * @param pkCountry 所属国家
     */
    R<?> handleExpireDate(Long userId, Integer pkCountry);

    /**
     * 提前三个月 把服务协议有效期续期一年
     */
    R<?> updateMemberExpireDate();

    /**
     * 更新会员信息（目前部分活动使用，）
     *
     * @param cuMember 会员信息
     */
    R<?> updateMemberInfo(CuMember cuMember);

    /**
     * 会员续约处理
     *
     * @param memberContinueDTO
     * @return
     */
    R<?> handleMemberContinue(MemberContinueDTO memberContinueDTO);

    /**
     * 根据会员编号查询会员信息（数量超过1000）
     *
     * @param memberCodeList 会员编号
     * @param pkCountry      国家ID
     * @return R<List < CuMember>>
     */
    R<List<CuMember>> findMemberByMemberCodeList(List<String> memberCodeList, Integer pkCountry);

    /**
     * 查询菜单用户
     *
     * @param pkMember 会员ID
     * @return
     */
    R<CuMemberExt> getMenuMember(Long pkMember);

    /**
     * 根据会员编号获取推荐人信息
     *
     * @param memberCode 会员编号
     * @return
     */
    R<CuMember> getParentMember(String memberCode);

    /**
     * 查询同姓名同手机号指定等级会员数量
     *
     * @param memberName 会员姓名
     * @param phone      手机号码
     * @param pkGrade    结算等级
     * @param pkCountry  所属国家
     * @return
     */
    R<Integer> countGradeMemberPoint(String memberName, String phone, Integer pkGrade, Integer pkCountry);

}
