package org.dromara.payment.bill.service;

import org.dromara.common.core.enums.BusRole;
import org.dromara.common.excel.core.ExcelResult;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.payment.bill.domain.MerBill;
import org.dromara.payment.bill.domain.bo.AddBillBo;
import org.dromara.payment.bill.domain.bo.MerBillBo;
import org.dromara.payment.bill.domain.bo.MerBillDetailBo;
import org.dromara.payment.bill.domain.vo.MerBillVo;
import org.dromara.payment.common.domain.TranLog;
import org.dromara.payment.common.domain.vo.TranLogVo;
import org.dromara.settlement.api.domain.TransactionLog;

import java.util.Collection;
import java.util.List;
import java.util.function.Supplier;

/**
 * 账单Service接口
 *
 * @author LionLi
 * @date 2024-04-08
 */
public interface IMerBillService {
    /**
     * 查询账单
     */
    MerBillVo queryById(Long id);

    /**
     * 查询账单
     */
    MerBillVo queryByNo(String no);

    /**
     * 查询账单列表
     */
    TableDataInfo<MerBillVo> queryPageList(MerBillBo bo, PageQuery pageQuery);

    /**
     * 查询账单列表
     */
    List<MerBillVo> queryList(MerBillBo bo);

    Integer queryListCount(MerBillBo bo);

    /**
     * 在线打款导入验证
     * @param bo
     * @return
     */
    public ExcelResult<MerBillDetailBo> onlinePaymentImport(AddBillBo bo);

    /**
     * 抢单项目打款导入验证
     * @param bo
     * @return
     */
    public ExcelResult<MerBillDetailBo> qdPaymentImport(AddBillBo bo);

    /**
     * 新增账单
     */
    Boolean insertByBo(AddBillBo bo);

    /**
     * 接单审核
     */
    Boolean orderApproval(MerBillBo bo);

    /**
     * 出款审批
     */
    Boolean paymentApproval(MerBillBo bo);

    /**
     * 修改账单
     */
    Boolean updateByBo(MerBillBo bo);

    /**
     * 校验并批量删除账单信息
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 商户转账到服务商B2B
     * @param billId
     * @return
     */
    Boolean paymentToService(int billId);

    /**
     * 服务商转账到个人B2C
     * @param billDetailId
     * @return
     */
    Boolean paymentToWorker(int billDetailId);

    /**
     * 服务商转账到个人B2C
     * @return
     */
    Boolean paymentToWorkers(MerBillVo bill);

    /**
     * 代发交易业务
     * @param tlog 交易记录
     * @param tran 本次交易结果
     * @return
     */
    TranLog billTransaction(TranLogVo tlog, TransactionLog tran);

    /**
     * 代发交易业务回置单
     * @param tlog 交易记录
     * @param callback 回置单地址
     * @return
     */
    Boolean billTransactionCallback(TranLogVo tlog, String callback);

    /**
     * 验证支付密码
     * @param role 角色
     * @param busId 业务id(商户id或服务商id)
     * @param supplier 验证密码结果函数
     */
    Boolean checkPayPassword(BusRole role, long busId, Supplier<Boolean> supplier);


    /***
     * 服务商验证
     * @param bo
     */

    public void validateSysSyd(AddBillBo  bo);
}
