package com.hzs.member.account.service;

import com.hzs.common.core.enums.EVerificationModule;
import com.hzs.common.domain.member.account.CuMemberAccount;
import com.hzs.common.domain.member.account.CuMemberAccountRechargeExt;
import com.hzs.common.domain.member.base.CuMember;
import com.hzs.common.domain.system.config.BdAccount;
import com.hzs.common.domain.system.config.BdTradeConfig;
import com.hzs.common.domain.system.config.BdTradeWhiteConfig;
import com.hzs.system.base.dto.CurrencyDTO;
import com.hzs.system.sys.dto.BusinessLogDTO;

import java.util.List;
import java.util.Map;

/**
 * 会员服务的公用调用三方服务
 */
public interface ICuMemberBaseService {

    /**
     * 根据国家ID获取汇率
     *
     * @param pkCountry 国家ID
     * @return CurrencyDTO 汇率信息
     */
    CurrencyDTO getCurrency(Integer pkCountry);

    /**
     * 根据汇率ID查询汇率
     *
     * @param currencyId ID
     * @return CurrencyDTO
     */
    CurrencyDTO getCurrencyById(Integer currencyId);

    /**
     * 根据ID查询 账户信息
     *
     * @param pkId 账户类型ID
     * @return BdAccount
     */
    BdAccount getAccount(Integer pkId);

    /**
     * 根据 模块类型、 国家ID查询账户类型
     *
     * @param accountType 账户类型
     * @param pkCountry   国家ID
     * @return List<BdAccount>
     */
    List<BdAccount> getAccountByCountry(Integer accountType, Integer pkCountry);

    /**
     * 根据国家ID查询账户类型
     *
     * @param pkCountry 国家ID
     * @return List<BdAccount>
     */
    List<BdAccount> getAccountByCountryId(Integer pkCountry);

    /**
     * 查询翻译的KEY值
     *
     * @param pkAccount 账户ID
     * @return Integer
     */
    Integer translateAccountValue(Integer pkAccount);

    /**
     * 根据币种ID查询币种对应的值
     *
     * @param pkAccount 账户ID
     * @return Integer
     */
    Integer getAccountValueById(Integer pkAccount);

    /**
     * 根据国家查询币种值集合
     *
     * @param pkCountry 国家ID
     * @return list
     */
    List<Integer> getAccountValuesByPkCountry(Integer pkCountry);

    /**
     * 金额为正时，只插入MemberTradeDetail
     *
     * @param sourceCode 来源单号
     */
    void saveMemberTradeDetail(String sourceCode);

    /**
     * 金额为负时，插入MemberTradeDetail  MemberTradeBonus
     *
     * @param memberAccountList 账户信息
     * @param sourceCode        来源单号
     * @param idsMap            业务ID
     * @param module            模块类型 来源于枚举
     */
    void handleMemberTradeDetailAndBonus(List<CuMemberAccount> memberAccountList, String sourceCode, Map<Long, Long> idsMap, Integer module);

    /**
     * 包括重复的会员ID map
     * 金额为负时，插入MemberTradeDetail  MemberTradeBonus
     *
     * @param memberAccountList 账户信息
     * @param module            模块类型 来源于枚举
     */
    void handleRepeatMemberTradeDetailAndBonus(List<CuMemberAccountRechargeExt> memberAccountList, Integer module);

    /**
     * 从数据库直译币种（导出用）
     *
     * @param pkAccount 币种翻译值
     * @return String
     */
    String getAccountTranslateFromDataBase(Integer pkAccount);

    /**
     * 查询是否配置白名单
     *
     * @param pkMember       会员ID
     * @param pkCountry      国家ID
     * @param businessModule 1:提现 2:转账 (来源枚举EBusinessModule)
     * @return BdTradeWhiteConfig
     */
    BdTradeWhiteConfig selectConfigWhite(Long pkMember, Integer pkCountry, Integer businessModule);

    /**
     * 查询交易配置信息
     *
     * @param pkMember            会员ID
     * @param pkCountry           国家ID
     * @param businessModule      1:提现 2:转账 (来源枚举EBusinessModule)
     * @param eVerificationModule 1：实名 2：营业执照 （来源枚举 EVerificationModule）
     * @return BdTradeConfig
     */
    BdTradeConfig selectConfigTrade(Long pkMember, Integer pkCountry, Integer businessModule, EVerificationModule eVerificationModule);

    /**
     * 根据配置是否实名认证
     *
     * @param pkMember       会员ID
     * @param pkCountry      国家ID
     * @param businessModule 1:提现 2:转账 (来源枚举EBusinessModule)
     * @return Boolean
     */
    Boolean isExistRealName(Long pkMember, Integer pkCountry, Integer businessModule);

    /**
     * 操作日志MQ
     */
    void operationLogMQ(List<BusinessLogDTO> businessLogDTOList);

    /**
     * 如果有服务编号优先使用，没有则使用会员编号
     *
     * @param cuMember 会员信息
     * @return String
     */
    String getMemberName(CuMember cuMember);

    /**
     * 根据体系判断会员名称还是会员昵称
     *
     * @param cuMember 会员信息
     * @return String
     */
    String getMemberNameByVertex(CuMember cuMember);

}
