package org.dromara.settlement.api;

import org.dromara.settlement.api.domain.*;

import java.util.List;



public interface RemoteAccountService
{
	/**
	 * 创建虚拟银行账号
	 * @author 张涛
	 * @date 2021年8月18日
	 * @param unitId 税源地id
	 * @param userType 用户类型(7:运营商 9:商户 10:自雇者 6:服务商 5:平台)
	 * @param userId 用户id（单位id或自雇者id或税源地id）
	 * @param userName 用户名称（单位名称或自雇者姓名或税源地名称）
	 * @return
	 */
	public Result<Account> addAccount(long unitId, int userType, Long userId, String userName, String bankType,Long code);

	/**
	 * 创建虚拟银行账号
	 *
	 * @param unitId       税源地id
	 * @param userType     用户类型(7:运营商 9:商户 10:自雇者 6:服务商 5:平台)
	 * @param userId       用户id（单位id或自雇者id或税源地id）
	 * @param userName     用户名称（单位名称或自雇者姓名或税源地名称）
	 * @param bindAcctNo   绑卡账户号码(真实公户)
	 * @param bindAcctName 绑卡账户名称(真实公户)
	 * @return
	 * @author 张涛
	 * @date 2021年8月18日
	 */
	public Result<Account> addAccount(long unitId, int userType, Long userId, String userName, String bankType, String bindAcctNo, String bindAcctName,Long code);

	/**
	 * 获取虚拟银行账号收款账户名
	 *
	 * @param unitId   税源地id
	 * @param bankType 银行名称
	 * @param bankCard 银行卡号
	 * @return
	 * @author 张涛
	 * @date 2021年8月26日
	 */
	public Result<String> getAccountName(long unitId, String bankType, String bankCard);

	/**
	 * 获取虚拟银行账号收款账户
	 *
	 * @param unitId   税源地id
	 * @param bankType 银行名称
	 * @return
	 * @author 张涛
	 * @date 2021年8月26日
	 */
	public Result<MainAccount> getMainAccount(long unitId, String bankType);

	/**
	 * 创建指定银行账号
	 *
	 * @param account
	 * @return
	 * @author 张涛
	 * @date 2021年8月20日
	 */
	public Result<Account> addAccount(Account account);

	/**
	 * 同步银行账户
	 * @author 张涛
	 * @date 2021年9月6日
	 * @param id 银行账户id
	 * @param trxdir 流水方向（1:收入 2:支出）
	 * @param synPosition 已同步位置id
	 * @param exclude 排除的交易摘要
	 * @return
	 */
	public Result<AccountSyn> synAccount(int id, Short trxdir, long synPosition, List<String> exclude);

	/**
	 * 申请银行账户转账
	 * @author 张涛
	 * @date 2021年9月7日
	 * @param sourceAccId 付款账户id
	 * @param targetAccId 收款账户id
	 * @param amount 转账金额（分）
	 * @param order 流水号(系统内部编号)
	 * @param remark 转账摘要
	 * @return
	 */
	public Result<TransactionLog> applyTransfer(int sourceAccId, int targetAccId, Long amount, String order, String remark);

	/**
	 * 银行账户转账
	 * @author 张涛
	 * @date 2021年9月7日
	 * @param tranId 交易id
	 * @return
	 */
	public Result<TransactionLog> transfer(long tranId);

	/**
	 * 同步银行账户交易结果
	 * @author 张涛
	 * @date 2021年9月7日
	 * @param tranId 交易id
	 * @return
	 */
	public Result<TransactionLog> synTransfer(long tranId);

	/**
	 * 查询交易记录
	 * @author 张涛
	 * @date 2021年9月7日
	 * @param tranId 交易id
	 * @return
	 */
	public Result<TransactionLog> getTransfer(long tranId);

	/**
	 * 获取交易流水号
	 * @author 张涛
	 * @date 2021年9月22日
	 * @param tranId 交易id
	 * @return
	 */
	public Result<String> getTransferBankNo(long tranId);

	/**
	 * 获取交易回置单
	 * @author 张涛
	 * @date 2021年9月16日
	 * @param tranId 交易id
	 * @return
	 */
	public Result<String> getTransferCallBack(long tranId);

	/**
	 * 获取签约信息
	 * @author 张涛
	 * @date 2022年9月8日
	 * @param unitId 单位id
	 * @param unitName 单位名称
	 * @return
	 */
	public Result<SignZhifubao> getSignInfo(long unitId, String unitName, String bankType);
}
