package com.ruoyi.bst.bonus.service;

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

import com.ruoyi.bst.bonus.domain.Bonus;
import com.ruoyi.bst.bonus.domain.BonusQuery;
import com.ruoyi.bst.bonus.domain.BonusVO;
import com.ruoyi.bst.bonus.domain.enums.BonusBstType;

/**
 * 分成明细Service接口
 *
 * @author ruoyi
 * @date 2025-03-26
 */
public interface BonusService {
    /**
     * 查询分成明细
     *
     * @param id 分成明细主键
     * @return 分成明细
     */
    public BonusVO selectBonusById(Long id, boolean scope);

    /**
     * 查询分成明细
     *
     * @param id 分成明细主键
     * @return 分成明细
     */
    default BonusVO selectBonusById(Long id) {
        return this.selectBonusById(id, false);
    }

    /**
     * 查询分成明细列表
     *
     * @param bonus 分成明细
     * @return 分成明细集合
     */
    public List<BonusVO> selectBonusList(BonusQuery bonus);

    /**
     * 新增分成明细
     *
     * @param bonus 分成明细
     * @return 结果
     */
    public int insertBonus(Bonus bonus);

    /**
     * 修改分成明细
     *
     * @param bonus 分成明细
     * @return 结果
     */
    public int updateBonus(Bonus bonus);

    /**
     * 批量删除分成明细
     *
     * @param ids 需要删除的分成明细主键集合
     * @return 结果
     */
    public int deleteBonusByIds(Long[] ids);

    /**
     * 删除分成明细信息
     *
     * @param id 分成明细主键
     * @return 结果
     */
    public int deleteBonusById(Long id);

    /**
     * 批量插入分成明细
     *
     * @param list 分成明细列表
     * @return 结果
     */
    public int batchInsert(List<? extends Bonus> list);

    /**
     * 根据业务类型和业务ID，将分成更新为待分成状态
     *
     * @param bstType 业务类型
     * @param bstId   业务ID
     */
    public boolean validByBst(BonusBstType bstType, Long bstId);

    /**
     * 预分成
     *
     * @param bstType 业务类型
     * @param bstId   业务ID
     * @param totalAmount 总金额
     * @param waitTime 待分成的时间
     * @return 结果
     */
    public boolean prepayByBst(BonusBstType bstType, Long bstId, BigDecimal totalAmount, LocalDateTime waitTime);

    /**
     * 分成打款
     *
     * @param bonus 分成明细
     * @return 结果
     */
    public int payBonus(BonusVO bonus);

    /**
     * 分成打款
     *
     * @param id 分成明细ID
     * @return 结果
     */
    public int payBonus(Long id);

    /**
     * 进行分成打款指定时间之前的分成
     *
     * @param time 时间
     * @return 结果
     */
    public int payBonusBeforeTime(LocalDateTime time);

    /**
     * 退款
     *
     * @param bstType   业务类型
     * @param bstId     业务ID
     * @param amount    退款金额
     * @param reason    退款原因
     * @return 结果
     */
    public boolean refundByBst(BonusBstType bstType, Long bstId, BigDecimal amount, String reason);

    /**
     * 预览设备分成信息
     *
     * @param deviceId 设备ID
     * @return 结果
     */
    public List<Bonus> preview(Long deviceId);

}
