package com.hzs.member.base;

import com.hzs.common.core.domain.R;
import com.hzs.common.domain.member.base.CuMember;
import com.hzs.common.domain.member.base.CuMemberRegister;
import com.hzs.common.domain.member.ext.CuMemberAccountExt;
import com.hzs.common.domain.member.ext.CuMemberExt;
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.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);

    /**
     * 根据会员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, 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            订单信息
     * @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 会员
     */
    R<CuMember> createMemberIdAndCode(CuMember cuMember);

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

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

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

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

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

    /**
     * 根据会员主键查询会员注册信息
     *
     * @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);

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

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

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

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

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

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

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

    /**
     * 查询菜单用户
     *
     * @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);

    /**
     * 查询新零售会员，优先使用会员ID
     *
     * @param pkMember   会员ID
     * @param memberCode 会员编号
     * @return
     */
    R<CuMember> getRetailMember(Long pkMember, String memberCode);

    /**
     * 新零售查询会员血缘伞上
     * pkMember、memberCode，必传一项
     * topPkMember、topMemberCode，必传一项
     *
     * @param pkMember      查询会员ID
     * @param memberCode    查询会员编号
     * @param topPkMember   顶点会员ID
     * @param topMemberCode 顶点会员编号
     * @return
     */
    R<CuMember> getRetailTopMember(Long pkMember, String memberCode, Long topPkMember, String topMemberCode);

    /**
     * 生成新零新会员ID和编号
     *
     * @param cuMember 会员信息
     * @return
     */
    R<CuMember> createRetailMemberIdAndCode(CuMember cuMember);

    /**
     * 注册新零售会员
     *
     * @param cuMember           新会员
     * @param saOrder            会员订单
     * @param cuMemberAccountExt 扣款账户
     * @return
     */
    R<?> saveRetailMember(CuMember cuMember, SaOrderExt saOrder, CuMemberAccountExt cuMemberAccountExt);

    /**
     * 升级新零售会员
     *
     * @param cuMember           升级会员
     * @param saOrder            会员订单
     * @param cuMemberAccountExt 扣款账户
     * @return
     */
    R<?> updateRetailMember(CuMember cuMember, SaOrderExt saOrder, CuMemberAccountExt cuMemberAccountExt);

    /**
     * 新零售会员其它订单处理
     *
     * @param cuMember           购买会员
     * @param saOrder            会员订单
     * @param cuMemberAccountExt 扣款账户
     * @param activateFlag       激活标记
     * @return
     */
    R<?> otherRetailMember(CuMember cuMember, SaOrderExt saOrder, CuMemberAccountExt cuMemberAccountExt, Boolean activateFlag);

    /**
     * 校验注册关系（是否跨团队）
     * 2024.12.24 修改为校验手机号必须唯一
     *
     * @param phone      联系方式
     * @param parentCode 推荐编号
     * @return 返回为null则正常，否则则错误信息
     */
    R<String> checkRegisterRelation(String phone, String parentCode);

}
