package com.jeesharp.business.modules.finance.merchantsettlement.service;

import com.jeesharp.business.modules.finance.merchantsettlement.entity.MerchantSettlementBill;
import com.jeesharp.business.modules.finance.merchantsettlement.vo.MerchantSettlementBillQueryVO;
import com.jeesharp.framework.mybatis.core.service.BaseInterface;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 商户结算单领域服务接口。
 *
 * @author jeesharp
 * @since 2026-06-29
 */
public interface MerchantSettlementBillService extends BaseInterface<MerchantSettlementBill, MerchantSettlementBillQueryVO> {

    /**
     * 新增结算单（生成账期结算）。
     */
    MerchantSettlementBill createBill(MerchantSettlementBill bill);

    /**
     * 更新结算单状态与已打款累计。
     */
    void updateBill(MerchantSettlementBill bill);

    /**
     * 按商户与账期查询有效结算单。
     */
    MerchantSettlementBill findByMerchantAndPeriod(String merchantTenantId, LocalDateTime periodStart,
            LocalDateTime periodEnd);

    /**
     * 待付商户金额（应付 − 已付，不小于 0）。
     */
    BigDecimal remainingMerchantAmount(MerchantSettlementBill bill);

    /**
     * 校验是否可登记打款及金额上限。
     */
    void validateRecordPayout(MerchantSettlementBill bill, BigDecimal payoutAmount);

    /**
     * 打款后应写入的结算单补丁（已付累计与状态）。
     */
    MerchantSettlementBill applyPayout(MerchantSettlementBill bill, BigDecimal payoutAmount);

    /**
     * 校验商户确认收款前置条件。
     */
    void validateMerchantConfirm(MerchantSettlementBill bill, String merchantTenantId);

    /**
     * 商户确认收款后应写入的结算单补丁。
     */
    MerchantSettlementBill applyMerchantConfirm(MerchantSettlementBill bill, String confirmBy);

    /**
     * 校验是否可作废。
     */
    void validateCancel(MerchantSettlementBill bill);

    /**
     * 作废后应写入的结算单补丁。
     */
    MerchantSettlementBill applyCancel(MerchantSettlementBill bill);
}
