package cn.pluss.platform.merchant;

import cn.pluss.platform.dto.AccountDTO;
import cn.pluss.platform.dto.BankCardDTO;
import cn.pluss.platform.dto.BankInfoDTO;
import cn.pluss.platform.dto.CertificationDTO;
import cn.pluss.platform.entity.*;
import cn.pluss.platform.mapper.AccountMapper;
import cn.pluss.platform.vo.AccountVO;
import cn.pluss.platform.vo.BankCardVO;
import cn.pluss.platform.vo.IdCardVO;
import cn.pluss.platform.vo.StoreSummaryVO;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

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

/**
 * 商户进件结算信息
 *
 * @author Djh
 */
public interface AccountService extends IService<Account> {

    /**
     * 修改成功
     *
     * @param mcs 商户进件信息
     */
    void editSuccess(MerchantChannelStatus mcs, String accountType);

    /**
     * 结算信息修改失败
     * @param mcs       商户进件信息
     * @param uniqueKey     唯一值
     * @param failReason    失败原因
     * @param accountType   结算类型。D0，D1
     */
    void editFail(MerchantChannelStatus mcs, String uniqueKey, String failReason, String accountType);

    /**
     * 分页数据
     * @param page      分页信息
     * @param account   查询条件
     * @param orderItem 排序
     * @return 分页数据
     */
    Page<AccountVO> page(Page<Account> page, Account account, OrderItem orderItem);

    default List<MerchantBaseInfo> getMbiListCertNo(String certNo) {
        return ((AccountMapper) getBaseMapper()).selectMbiListByCertNo(certNo);
    }

    /**
     * 保存或变更结算信息
     *
     * @param accountDTO 结算信息参数
     *                   <p>
     *                   根据settleType来判断结算类型<br/>
     *                   对公则，只处理一个bankCard参数
     *                   其余则需要对idCard和bankCard都要处理
     *                   </p>
     */
    void saveOrUpdate(AccountDTO accountDTO);

    /**
     * 保存或变更结算信息v4
     *
     * @param accountDTO 结算信息参数
     *                   <p>
     *                   根据settleType来判断结算类型<br/>
     *                   对公则，只处理一个bankCard参数
     *                   其余则需要对idCard和bankCard都要处理
     *                   </p>
     * @param checkFlag  是否进行4要素
     */
    void saveV4(AccountDTO accountDTO, boolean checkFlag);

    /**
     * 保存或变更结算信息v4
     *
     * @param accountDTO 结算信息参数
     *                   <p>
     *                   根据settleType来判断结算类型<br/>
     *                   对公则，只处理一个bankCard参数
     *                   其余则需要对idCard和bankCard都要处理
     *                   </p>
     */
    default void saveV4(AccountDTO accountDTO) {
        saveV4(accountDTO, true);
    }

    /**
     * 获取结算信息(app回显时候使用，账户信息与法人信息可能并未对应)
     *
     * @param userId
     * @return
     */
    AccountDTO getAccount(String userId);

    /**
     * 获取全部结算信息
     * @param userId    用户id
     * @return
     */
    Map<String, AccountDTO> getAccounts(String userId);

    /**
     * 清理指定用户的结算信息
     *
     * @param userId      用户id
     * @param channelType 通道类型
     */
    void delAccount(String userId, String channelType);

    /**
     * 获取结算信息，进件时候使用，结算账户与法人信息对应
     *
     * @param userId
     * @return
     */
    AccountDTO getRealAccount(String userId);

    /**
     * 获取用户指定结算通道类型下的结算信息
     *
     * @param userId      用户id
     * @param channelType 通道类型、D1、D0
     * @return
     */
    AccountDTO getRealAccount(String userId, String channelType);

    AccountDTO getRealAccount(Account account);

    /**
     * 用户实名认证-身份证信息
     *
     * @param certificationDTO
     */
    void realNameAudit(CertificationDTO certificationDTO);


    /**
     * 用户实名认证-银行卡信息
     *
     * @param bankInfoDTO
     */
    void bankcardAudit(BankInfoDTO bankInfoDTO);

    /**
     * 用户实名身份证信息回显
     *
     * @param userId 用户id
     * @return
     */
    IdCardVO idCardDetail(String userId);

    /**
     * 用户实名银行卡信息回显
     *
     * @param userId
     * @return
     */
    BankCardVO bankcardDetail(String userId);

    /**
     * 进件小微结算身份证号校验
     *
     * @param certNo   身份证号
     * @param checkMsg 校验不通过提示信息
     */
    void checkCert(String certNo, String checkMsg);

    /**
     * 获取进件相关信息
     *
     * @param userId       用户id
     * @param merchantType 商户类型，-1则表示查询现有信息，其他类型则会过滤某些数据
     * @return 进件相关信息
     */
    StoreSummaryVO getReckoner(String userId, String merchantType);

    /**
     * 获取进件相关信息v2
     *
     * @param userId       用户id
     * @param merchantType 商户类型，-1则表示查询现有信息，其他类型则会过滤某些数据
     * @return 进件相关信息
     */
    StoreSummaryVO getReckonerV2(String userId, String merchantType);

    /**
     * 保存图片数据
     *
     * @param merchantCode     商户code
     * @param bankCard         银行卡信息
     * @param legalIdCard      法人/商户负责人身份证信息
     * @param accountIdcIdCard 结算人身份证信息
     * @param certificateUrl   非法人授权函
     */
    void saveImage(String merchantCode, BankCard bankCard, IdCard legalIdCard, IdCard accountIdcIdCard, String certificateUrl);

    /**
     * 修改结算银行卡
     *
     * @param bankCard 银行卡信息
     */
    void editAccountBankCard(BankCard bankCard);

    /**
     * 修改结算银行卡
     *
     * @param bankCardDTO 银行卡信息
     */
    void editAccountBankCardV2(BankCardDTO bankCardDTO);

    /**
     * 是否可以修改银行卡
     *
     * @param merchantCode 商户code
     * @return 是，即代表可以执行修改操作
     */
    boolean canEditBankCard(String merchantCode);
}
