package com.hzs.member.account.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hzs.common.domain.member.account.CuMemberAccount;
import com.hzs.common.domain.member.ext.CuMemberAccountExt;
import com.hzs.member.account.dto.CuMemberBonusAccountParam;
import com.hzs.member.account.dto.CuMemberRechargeAccountParam;
import com.hzs.member.account.dto.MemberAmountDTO;
import com.hzs.member.account.vo.CuMemberAccountVO;
import com.hzs.member.account.vo.CuMemberRechargeVO;
import com.hzs.member.account.vo.CuMemberWalletDetailVO;
import com.hzs.member.handlebusiness.vo.BusinessMemberVO;
import org.apache.ibatis.annotations.Param;

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

/**
 * 会员账户信息 Mapper 接口
 *
 * @author hzs
 * @since 2022-08-11
 */
public interface CuMemberAccountMapper extends BaseMapper<CuMemberAccount> {

    /**
     * 查询会员账户状态，账户信息
     *
     * @param cuMemberAccount 会员账户条件信息
     * @return: List<CuMemberAccountExt>
     * @Author: sui q
     * @Date: 2022/9/5 11:57
     */
    List<CuMemberAccountExt> queryMemberAccountByCondition(CuMemberAccount cuMemberAccount);


    /**
     * 根据会员编码获取余额
     *
     * @param pkMember    会员编号
     * @param accountType 账户类型
     * @return BigDecimal
     */
    BigDecimal selectBalanceByMemberCode(@Param("pkMember") Long pkMember, @Param("accountType") Integer accountType);

    /**
     * 更新账户余额
     *
     * @param cuMemberAccount 会员账户表
     * @return: Integer
     * @Author: sui q
     * @Date: 2022/9/21 21:42
     */
    Integer updateMemberAccount(CuMemberAccount cuMemberAccount);


    /**
     * 根据国家查询余额与银行卡信息
     *
     * @param pkCountry 国家ID
     * @return List<CuMemberAccountExt>
     */
    List<CuMemberAccountExt> queryMemberAccountByPkCountry(@Param("pkCountry") Integer pkCountry);

    /**
     * 根据用户编号查询账户余额 （行转列）
     *
     * @param memberCode 会员编号
     * @return List<CuMemberRechargeAccountParam>
     */
    List<CuMemberRechargeAccountParam> queryMemberAccountByMemberCode(@Param("memberCode") String memberCode, @Param("accountTypes") List<Integer> accountTypes, @Param("pkMember") Long pkMember);

    /**
     * 获得更新账户余额 奖金账户、可提现账户、可消费账户
     * 奖金账户 = 可提现账户+可消费账户
     * 奖金账户操作时 ：入的金额 进可消费账户  出的金额 进可提现账户
     * <p>
     * 根据用户batch 批量更新余额
     *
     * @param batch 批次号
     * @param type  操作类型（1：转入、2：转出）
     * @return Boolean
     */
    Boolean updateBatchMemberAccountByPkmember(@Param("batch") String batch, @Param("pkModified") Long pkModified, @Param("type") int type);


    /**
     * 根据用户编号集查询余额（余额字段）
     *
     * @param memberCodes 用户编号
     * @return List<CuMemberAccount>
     */
    List<CuMemberAccountExt> queryMemberAccountByMemberCodes(@Param(value = "memberCodes") List<CuMemberRechargeVO> memberCodes,
                                                             @Param(value = "memberCodeStrs") List<String> memberCodeStrs);


    /**
     * 根据用户编号集查询用户账户的全部字段信息
     *
     * @param memberCodes 用户编号
     * @return List<CuMemberAccountExt>
     */
    List<CuMemberAccountExt> queryMemberAccountAllByMemberCodes(@Param(value = "memberCodes") List<String> memberCodes);

    /**
     * 查询钱包明细
     *
     * @param memberWalletDetailVO 账户入参
     * @return List<CuMemberAccountExt>
     */
    List<CuMemberAccountExt> selectMemberAccountList(CuMemberWalletDetailVO memberWalletDetailVO);

    /**
     * 根据用户编号查询用户ID
     *
     * @param memberCodes 用户编号
     * @param pkCountry   国家
     * @return List<Long>
     */
    List<Long> selectPkMembersByMemberCode(@Param("memberCodes") List<String> memberCodes, @Param("pkCountry") Integer pkCountry);

    /**
     * 更新冻结账户信息
     *
     * @param cuMemberAccount
     * @return Integer
     */
    Integer updateFrozenAmountInfo(CuMemberAccountExt cuMemberAccount);


    /**
     * 根据用户ID集查询余额
     *
     * @param pkMembers 用户IDS
     * @return List<CuMemberAccountExt>
     */
    List<CuMemberAccountExt> queryMemberAccountByPkMember(@Param(value = "pkMembers") List<MemberAmountDTO> pkMembers);

    /**
     * 批量更新账户余额（不同账户同一账户）
     *
     * @param pkMemberList 更新信息
     * @param pkAccount    账户类型
     * @return Boolean
     */
    Boolean batchUpdateMemberAccountByPkMember(@Param("pkMemberList") List<MemberAmountDTO> pkMemberList, @Param("pkAccount") int pkAccount, @Param("isWithdraw") Integer isWithdraw);

    /**
     * 更新账户余额（不同用户不同账户）
     * @param pkMemberList 更新信息
     * @param isWithdraw 账户类型
     * @return Boolean
     */
    Boolean batchUpdateMemberAccountByPkMemberCountry(@Param("pkMemberList") List<MemberAmountDTO> pkMemberList,  @Param("isWithdraw") Integer isWithdraw);



    /**
     * 批理更新会员的钱包状态
     *
     * @param businessValueList  办理业务钱包状态值
     * @param businessMemberList 会员信息
     * @param updatePkMember     变更人
     * @return Integer
     */
    Integer batchUpdateWalletStateByPkMember(@Param("businessValueList") List<Integer> businessValueList, @Param("businessMemberList") List<BusinessMemberVO> businessMemberList, @Param("updatePkMember") Long updatePkMember);

    /**
     * 根据用户ID集合查询用户余额
     *
     * @param pkMembers 用户ID集合
     * @return List<CuMemberAccount>
     */
    List<CuMemberAccount> selectMemberAccountByPkMember(@Param(value = "pkMembers") List<Long> pkMembers);

    /**
     * 查询会员账户以及会员信息
     *
     * @param memberIdList 会员ID列表
     * @return
     */
    List<CuMemberAccountExt> queryAccountAndMemberInfo(@Param("memberIdList") List<Long> memberIdList);

    /**
     * 根据用户ID查询钱包余额
     *
     * @param pkMember ID
     * @return CuMemberRechargeAccountParam
     */
    List<CuMemberRechargeAccountParam> queryWalletBalanceByPkMember(@Param("pkMember") Long pkMember);


    /**
     * 根据会员姓名与会员编号查询账户信息
     *
     * @param cuMemberAccountVO 账户信息
     * @return List<CuMemberAccountExt>
     */
    List<CuMemberAccountExt> queryMemberAccountByMemberCodeAndName(CuMemberAccountVO cuMemberAccountVO);

    /**
     * 奖金发放，根据期间发放奖金，更新奖金余额
     *
     * @param startPeriod 期间
     * @return: void
     * @Author: sui q
     * @Date: 2023/3/21 14:12
     */
    void updateMemberAccountGrantByPeriod(@Param("pkCountry") Integer pkCountry, @Param("startPeriod") Integer startPeriod,
                                          @Param("endPeriod") Integer endPeriod);

    /**
     * 奖金可提现，根据期间更新可提现金额，减少可消费金额
     *
     * @param startPeriod 期间
     * @return: void
     * @Author: sui q
     * @Date: 2023/3/21 14:12
     */
    void updateMemberAccountWithdrawalByPeriod(@Param("startPeriod") Integer startPeriod, @Param("endPeriod") Integer endPeriod, @Param("pkCountry") Integer pkCountry);

    /**
     * 批量更新奖金账号
     *
     * @param bonusList   奖金账号参数
     * @param operateType 操作类型
     * @param operateType 修改人
     * @return Boolean
     */
    Boolean batchUpdateBonusAccountByPkMember(@Param("bonusList") List<CuMemberBonusAccountParam> bonusList,
                                              @Param("operateType") int operateType,
                                              @Param("pkModified") Long pkModified);

    /**
     * 根据来源单号查询奖金账号信息
     *
     * @param sourceCode 来源单号
     * @return List<CuMemberAccount>
     */
    List<CuMemberAccount> selectMemberBonusAccountBySourceCode(String sourceCode);

    /**
     * 查询指定数量会员账户SEQ
     *
     * @param param 数量
     * @return
     */
    List<Long> querySeqList(@Param("param") Integer param);

    /**
     * 批量保存会员账户信息
     *
     * @param memberAccountList 会员账户列表
     * @return
     */
    int insertBatchCuMemberAccount(@Param("memberAccountList") List<CuMemberAccount> memberAccountList);

}
