
package com.tmerclub.cloud.payment.service;

import com.tmerclub.cloud.api.payment.allinpay.member.resp.BindCard;
import com.tmerclub.cloud.api.payment.allinpay.order.resp.PayByBackSmsResp;
import com.tmerclub.cloud.api.payment.allinpay.order.resp.QueryBalanceResp;
import com.tmerclub.cloud.common.database.dto.PageDTO;
import com.tmerclub.cloud.common.database.vo.PageVO;
import com.tmerclub.cloud.payment.allinpay.member.resp.*;
import com.tmerclub.cloud.payment.allinpay.member.resp.*;
import com.tmerclub.cloud.payment.allinpay.order.resp.GetOrderStatusResp;
import com.tmerclub.cloud.payment.allinpay.order.resp.InExpDetail;
import com.tmerclub.cloud.payment.allinpay.order.resp.ResendPaySmsResp;
import com.tmerclub.cloud.payment.dto.*;
import com.tmerclub.cloud.payment.dto.*;

import java.util.List;

/**
 * @author lanhai
 */
public interface AllinpayService {

    /**
     * 注册会员
     *
     * @param bizUserId
     * @param sysType   系统类型
     */
    void createMember(String bizUserId, Integer sysType);

    /**
     * 获取个人会员信息
     * @param bizUserId 商户userId
     * @return
     */
    UserInfo getUserInfo(String bizUserId);

    /**
     * 发送短信验证码
     * @param userId 用户id
     * @param verificationCodeDTO 短信验证码类
     */
    void sendVerificationCode(String userId, VerificationCodeDTO verificationCodeDTO);

    /**
     * 绑定手机
     * @param userId 用户id
     * @param verificationCodeDTO 短信验证码类
     */
    void bindPhone(String userId, VerificationCodeDTO verificationCodeDTO);

    /**
     * 解绑手机
     * @param userId 用户id
     * @param verificationCodeDTO 短信验证码类
     */
    void unbindPhone(String userId, VerificationCodeDTO verificationCodeDTO);

    /**
     * 修改绑定手机（返回通联url形式）[仅限个人会员]
     * @param bizUserId
     * @param updatePhoneByPayPwdDTO
     * @param backUrl
     * @return
     */
    String updatePhoneByPayPwd(String bizUserId, String backUrl, UpdatePhoneByPayPwdDTO updatePhoneByPayPwdDTO);

    /**
     * 个人实名验证
     * @param userId 用户id
     * @param setRealNameDTO 实名验证类
     */
    void setRealName(Long userId, SetRealNameDTO setRealNameDTO);

    /**
     * 锁定会员
     * @param lockMemberDTO 锁定会员类
     */
    void lockMember(LockMemberDTO lockMemberDTO);

    /**
     * 解锁会员
     * @param lockMemberDTO 锁定会员类
     */
    void unlockMember(LockMemberDTO lockMemberDTO);

    /**
     * 查询卡bin
     * @param cardNo 卡号
     * @return
     */
    CardBinInfo getBankCardBin(String cardNo);

    /**
     * 请求绑定银行卡
     * @param userId
     * @param applyBankCardDTO
     * @return
     */
    ApplyBindBankCardResp applyBindBankCard(String userId, ApplyBankCardDTO applyBankCardDTO);

    /**
     * 确认绑定银行卡
     * @param userId
     * @param bindBankCardDTO
     */
    void bindBankCard(String userId, BindBankCardDTO bindBankCardDTO);

    /**
     * 解绑银行卡
     * @param userId
     * @param unbindBankCardDTO
     */
    void unbindBankCard(String userId, UnbindBankCardDTO unbindBankCardDTO);

    /**
     * 查询银行卡
     * @param userId
     * @param cardNo
     * @return
     */
    List<BindCard> queryBankCard(String userId, String cardNo);

    /**
     * 会员绑定支付账户用户标识
     * @param bizUserId 商户用户id
     * @param applyBindAcctDTO 绑定标识类
     */
    void applyBindAcct(String bizUserId, ApplyBindAcctDTO applyBindAcctDTO);

    /**
     * 查询已绑定的支付账号用户标识
     *
     * @param bizUserId
     * @return
     */
    QueryBindAcctResp queryBindAcct(String bizUserId);

    /**
     * 设置支付密码
     * @param userId 用户id
     * @param backUrl 通知回调地址
     * @param setPayPwdDTO 设置支付密码类
     * @return
     */
    String setPayPwd(Long userId, String backUrl, SetPayPwdDTO setPayPwdDTO);

    /**
     * 修改支付密码
     * @param userId 用户id
     * @param backUrl 通知回调地址
     * @param setPayPwdDTO 设置支付密码类
     * @return
     */
    String updatePayPwd(Long userId, String backUrl, SetPayPwdDTO setPayPwdDTO);

    /**
     * 重置支付密码
     * @param userId 用户id
     * @param backUrl 通知回调地址
     * @param setPayPwdDTO 设置支付密码类
     * @return
     */
    String resetPayPwd(Long userId, String backUrl, SetPayPwdDTO setPayPwdDTO);

    /**
     * 账户提现协议签约
     * @param bizUserId 商户系统用户id
     * @param backUrl 通知地址
     * @param signAcctProtocolDTO 签约提现协议类
     * @return
     */
    String signAcctProtocol(String bizUserId, String backUrl, SignAcctProtocolDTO signAcctProtocolDTO);

    /**
     * 账户协议签约查询
     * @param bizUserId 商户系统用户id
     * @param signAcctProtocolDTO 签约提现协议类
     * @return
     */
    String signContractQuery(String bizUserId, SignAcctProtocolDTO signAcctProtocolDTO);

    /**
     * 修改绑定手机(银行卡验证版)
     * @param bizUserId
     * @param bankCardChangeBindPhoneDTO
     * @return
     */
    BankCardChangeBindPhoneResp bankCardChangeBindPhone(String bizUserId, BankCardChangeBindPhoneDTO bankCardChangeBindPhoneDTO);

    /**
     * 确认修改绑定手机(银行卡验证版)
     * @param bizUserId
     * @param verifyBankCardChangeBindPhoneDTO
     */
    void verifyBankCardChangeBindPhone(String bizUserId, VerifyBankCardChangeBindPhoneDTO verifyBankCardChangeBindPhoneDTO);

    /**
     * 查询账户余额
     * @param bizUserId 商户userId
     * @param sysType 系统类型
     * @return
     */
    QueryBalanceResp queryBalance(String bizUserId, Integer sysType);

    /**
     * 查询账户收支明细接口
     * @param bizUserId 商户userId
     * @param pageDTO 分页参数
     * @param queryInExpDetailDTO 查询参数
     * @return
     */
    PageVO<InExpDetail> queryInExpDetail(String bizUserId, PageDTO pageDTO, QueryInExpDetailDTO queryInExpDetailDTO);

    /**
     * 确认支付[前台+短信验证码]
     * @param bizUserId
     * @param payBySmsDTO
     * @return
     */
    String payBySms(String bizUserId, PayBySmsDTO payBySmsDTO);

    /**
     * 确认支付[前台+支付密码]
     * @param bizUserId
     * @param payByPwdDTO
     * @return
     */
    String payByPwd(String bizUserId, PayByPwdDTO payByPwdDTO);

    /**
     * 确认支付[后台+短信验证码]
     *
     * @param bizUserId
     * @param payByBackSmsDTO
     * @return
     */
    PayByBackSmsResp payByBackSms(String bizUserId, PayByBackSmsDTO payByBackSmsDTO);

    /**
     * 重复支付短信验证码
     *
     * @param bizOrderNo
     * @return
     */
    ResendPaySmsResp resendPaySms(String bizOrderNo);

    /**
     * 获取订单状态
     * @param bizUserId
     * @param bizOrderNo
     * @return
     */
    GetOrderStatusResp getOrderStatus(String bizUserId, String bizOrderNo);
}
