package com.hzs.member.account.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.common.domain.member.account.CuMemberAccount;
import com.hzs.common.domain.member.ext.CuMemberAccountExt;
import com.hzs.member.account.dto.*;
import com.hzs.member.account.vo.*;
import com.hzs.member.handlebusiness.vo.BusinessMemberVO;
import org.apache.ibatis.annotations.Param;

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

/**
 * 会员账户信息 服务类
 */
public interface ICuMemberAccountService extends IService<CuMemberAccount> {

    /**
     * 查询会员账户状态，账户信息
     *
     * @param cuMemberAccount 会员账户条件信息
     */
    List<CuMemberAccountExt> queryMemberAccountByCondition(CuMemberAccount cuMemberAccount);


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


    /**
     * 更新用户余额
     *
     * @param cuMemberAccountParam 入参
     * @return int
     */
    Integer updateMemberAccountByMemberCode(CuMemberAccountParam cuMemberAccountParam);

    /**
     * 冻结签呈显示
     *
     * @param memberFrozenParam 冻结入参
     * @return CuMemberPetitionVO
     */
    CuMemberPetitionVO showFrozenAmountPetition(CuMemberFrozenParam memberFrozenParam);

    /**
     * 更新账户余额
     *
     * @param cuMemberAccount 会员账户表
     * @param pkModified      修改人
     */
    Boolean updateMemberAccount(CuMemberAccount cuMemberAccount, Long pkModified);

    /**
     * 根据用户ID查询余额信息
     *
     * @param pkMember 用户ID
     * @return CuMemberAccount
     */
    CuMemberAccount queryCuMemberAccountByPkMember(Long pkMember);

    /**
     * 根据会员id 列表查询账户信息
     *
     * @param pkMemberList 列表
     */
    List<CuMemberAccount> queryCuMemberAccountByPkMembers(List<Long> pkMemberList);

    /**
     * 查询钱包余额（会员端）
     *
     * @param pkMember  会员ID
     * @param pkCountry 国家ID
     * @return List<CuMemberWalletBalanceVO>
     */
    CuMemberAccountVO queryWalletBalanceByPkMember(Long pkMember, Integer pkCountry);

    /**
     * 查询账户详情
     *
     * @param pkMember  会员ID
     * @param pkCountry 国家ID
     * @return List<CuMemberAccountShowVO>
     */
    List<CuMemberAccountShowVO> selectAccountDetail(Long pkMember, Integer pkCountry);

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

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

    /**
     * 批量充值币种显示
     *
     * @param pkAccounts 币种
     * @param pkCountry  国家
     * @return List<CuMemberRechargeAccountParam>
     */
    List<CuMemberRechargeAccountParam> queryBatchRechargeAccount(List<Integer> pkAccounts, Integer pkCountry);

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

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


    /**
     * 根据用户编号集查询余额(所有字段)
     *
     * @param memberCodes 用户编号
     * @return List<CuMemberAccountVO>
     */
    List<CuMemberWalletDetailVO> queryMemberAccountAllByMemberCodes(List<String> memberCodes, Integer pkCountry);


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


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

    /**
     * 更新冻结账户信息
     *
     * @param memberFrozenParam 账户冻结参数
     * @return Integer
     */
    boolean frozenAmount(CuMemberFrozenParam memberFrozenParam);

    /**
     * 冻结账户审核通过
     *
     * @param frozenData 冻结的Json数据
     * @return Integer
     */
    Integer approvalPass(String frozenData);

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

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


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


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

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

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

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


    List<CuMemberAccountExportVO> selectFrozenAmountExport(CuMemberAccountVO cuMemberAccountVO);

    /**
     * 奖金发放，根据期间发放奖金，更新奖金余额
     *
     * @param startPeriod 期间
     */
    void updateMemberAccountGrantByPeriod(Integer pkCountry, Integer startPeriod, Integer endPeriod);

    /**
     * 奖金可提现，根据期间更新可提现金额，减少可消费金额
     *
     * @param startPeriod 期间
     */
    void updateMemberAccountWithdrawalByPeriod(Integer startPeriod, Integer endPeriod, Integer pkCountry);

    /**
     * 根据用户ID查询账户余额信息
     *
     * @param pkAccount 币种值
     * @param pkMember  会员ID
     * @return CuMemberRechargeAccountParam
     */
    CuMemberRechargeAccountParam findMemberBalanceById(Integer pkAccount, Long pkMember);


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


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

    /**
     * 删除会员奖金账号
     *
     * @param pkMember        会员账户
     * @param pkApprove       审核人
     * @param currentDateTime 当前时间
     */
    void deleteCuMemberAccountByPkMember(Long pkMember, Long pkApprove, Date currentDateTime);

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

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

}
