package com.hzs.member.account.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.common.core.enums.EApproveOperation;
import com.hzs.common.domain.member.account.CuMemberAccountRechargeExt;
import com.hzs.common.domain.member.account.CuMemberRecharge;
import com.hzs.common.domain.member.account.CuMemberRechargeExt;
import com.hzs.member.account.dto.CuMemberBatchRechargeParam;
import com.hzs.member.account.dto.CuMemberRechargeParam;
import com.hzs.member.account.dto.MemberAccountAudit;
import com.hzs.member.account.vo.CuMemberPetitionVO;
import com.hzs.member.account.vo.CuMemberRechargeDetailVO;
import com.hzs.member.account.vo.CuMemberRechargeVO;
import com.hzs.system.sys.dto.ApprovalBusinessResultDTO;

import java.util.Date;
import java.util.List;

/**
 * 会员充值表 服务类
 */
public interface ICuMemberRechargeService extends IService<CuMemberRecharge> {

    /**
     * 根据批次查询充值信息
     *
     * @param batch 批次
     * @return List<CuMemberRecharge>
     */
    List<CuMemberRecharge> selectRechargeByBatch(String batch);

    /**
     * 会员批量充值
     *
     * @param batchRechargeParam 参数
     * @return Integer
     */
    Integer saveBatchMemberRecharge(CuMemberBatchRechargeParam batchRechargeParam);

    /**
     * 根据充值单号更新审核状态信息
     *
     * @param memberAccountAudit 用户审核信息
     * @return int
     */
    Integer updateBathRechargeByRechargeCode(MemberAccountAudit memberAccountAudit);

    /**
     * 提交充值审核
     *
     * @param memberAccountAudit 用户审核信息
     * @return int
     */
    Integer submitAuditMemberRecharge(MemberAccountAudit memberAccountAudit);

    /**
     * 审核通过后插入交易明细和用户余额表
     *
     * @param approvalBusinessResultDTO 业务审批操作DTO
     * @param cuMemberRecharges         充值信息
     */
    void updateMemberTradeAndMemberBalance(ApprovalBusinessResultDTO approvalBusinessResultDTO, List<CuMemberRecharge> cuMemberRecharges);

    /**
     * 查询充值信息详情
     *
     * @param pkId ID
     * @return
     */
    CuMemberRechargeDetailVO queryCuMemberRechargeDetail(Long pkId);

    /**
     * 充值列表展示
     *
     * @param memberRechargeVO 查询参数
     * @return List<CuMemberRechargeVO>
     */
    Object[] findRechargeList(CuMemberRechargeVO memberRechargeVO);

    /**
     * 显示充值在线签呈
     *
     * @param memberRechargeParam 充值参数
     * @return CuMemberPetitionVo
     */
    CuMemberPetitionVO showMemberPetition(CuMemberRechargeParam memberRechargeParam);

    /**
     * 会员端在线预充值
     *
     * @param rechargeAmount 充值金额
     * @param pkCountry      国家ID
     * @param pkMember       会员ID
     * @param rechargeCode   充值单号
     * @return Boolean
     */
    Boolean preCharge(String rechargeAmount, Integer pkCountry, Long pkMember, String rechargeCode, Long pkCreator);

    /**
     * 会员端在线支付更新审批状态
     *
     * @param rechargeCode      充值单号
     * @param eApproveOperation 审批状态 （充值成功：审核通过 充值失败 ：审核驳回）
     * @param pkMember          会员ID
     * @return Integer
     */
    Integer updateOnlineRechargeByRechargeCode(String rechargeCode, EApproveOperation eApproveOperation, Long pkMember);

    /**
     * 根据充值单号查询充值信息
     *
     * @param rechargeCode 充值单号
     * @return CuMemberRecharge
     */
    CuMemberRecharge getCuMemberRechargeByRechargeCode(String rechargeCode);

    /**
     * 根据充值单号与用户ID查询充值信息
     *
     * @param cuMemberRechargeVO 查询参数
     * @return CuMemberRecharge
     */
    CuMemberRecharge selectMemberRechargeByCodeAndPkMember(CuMemberRechargeVO cuMemberRechargeVO);

    /**
     * 先入先出操作奖金充值明细
     *
     * @param memberAccountList 奖金账户信息
     * @param rechargeMethod    充值方式
     */
    void saveMemberTradeDetailAndBonus(List<CuMemberAccountRechargeExt> memberAccountList, Integer rechargeMethod, String businessCode);

    /**
     * 根据会员编号查询提交审核的用户
     *
     * @param pkCountry   国家ID
     * @param memberCodes 会员编号
     * @return List<String>
     */
    List<String> selectMemberRechargeApproveByUserCode(Integer pkCountry, List<String> memberCodes);

    /**
     * 查询操作人
     *
     * @param pkCountry 国家ID
     * @return List<String>
     */
    List<CuMemberRechargeExt> selectOperator(Integer pkCountry);

    /**
     * 查询总金额
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return List<CuMemberRecharge>
     */
    CuMemberRecharge selectRechargeTotalAmount(Date startDate, Date endDate);

}
