package com.yolo.keyboard.service.tenantbalance;

import java.util.*;

import com.yolo.keyboard.dal.dataobject.tenantbalancetransaction.TenantBalanceTransactionDO;
import jakarta.validation.*;
import com.yolo.keyboard.controller.admin.tenantbalance.vo.*;
import com.yolo.keyboard.dal.dataobject.tenantbalance.TenantBalanceDO;
import com.yolo.keyboard.framework.common.pojo.PageResult;
import com.yolo.keyboard.framework.common.pojo.PageParam;

/**
 * 租户余额 Service 接口
 *
 * @author 芋道源码
 */
public interface TenantBalanceService {

    /**
     * 创建租户余额
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createTenantBalance(@Valid TenantBalanceSaveReqVO createReqVO);

    /**
     * 更新租户余额
     *
     * @param updateReqVO 更新信息
     */
    void updateTenantBalance(@Valid TenantBalanceSaveReqVO updateReqVO);

    /**
     * 删除租户余额
     *
     * @param id 编号
     */
    void deleteTenantBalance(Long id);

    /**
    * 批量删除租户余额
    *
    * @param ids 编号
    */
    void deleteTenantBalanceListByIds(List<Long> ids);

    /**
     * 获得租户余额
     *
     * @param id 编号
     * @return 租户余额
     */
    TenantBalanceDO getTenantBalance(Long id);

    /**
     * 获得租户余额分页
     *
     * @param pageReqVO 分页查询
     * @return 租户余额分页
     */
    PageResult<TenantBalanceDO> getTenantBalancePage(TenantBalancePageReqVO pageReqVO);

    /**
     * 添加租户余额
     *
     * @param addReqVO 添加信息
     */
    void addTenantBalance(@Valid TenantBalanceAddReqVO addReqVO);

    /**
     * 获得自己的余额
     *
     * @return 租户余额
     */
    TenantBalanceDO getSelfBalance();

    /**
     * 获得自己下级余额的分页
     *
     * @param pageReqVO 分页查询
     * @return 租户余额分页
     */
    PageResult<TenantBalanceRespVO> getSelfSubordinateTenantBalancePage(TenantBalancePageReqVO pageReqVO);

    /**
     * 获得租户积分记录分页
     *
     * @param pageReqVO 分页查询
     * @param tenantId 租户 Id
     * @return 租户积分记录分页
     */
    PageResult<TenantBalanceTransactionDO> getTenantBalanceTransactionPage(PageParam pageReqVO, Long tenantId);

    /**
     * 创建租户积分记录
     *
     * @param tenantBalanceTransaction 创建信息
     * @return 编号
     */
    Long createTenantBalanceTransaction(@Valid TenantBalanceTransactionDO tenantBalanceTransaction);

    /**
     * 更新租户积分记录
     *
     * @param tenantBalanceTransaction 更新信息
     */
    void updateTenantBalanceTransaction(@Valid TenantBalanceTransactionDO tenantBalanceTransaction);

    /**
     * 删除租户积分记录
     *
     * @param id 编号
     */
    void deleteTenantBalanceTransaction(Long id);

    /**
     * 批量删除租户积分记录
     *
     * @param ids 编号
     */
    void deleteTenantBalanceTransactionListByIds(List<Long> ids);

    /**
     * 获得租户积分记录
     *
     * @param id 编号
     * @return 租户积分记录
     */
    TenantBalanceTransactionDO getTenantBalanceTransaction(Long id);

    /**
     * 租户提现
     *
     * @param withdrawReqVO 提现信息
     */
    void withdraw(@Valid TenantBalanceWithdrawReqVO withdrawReqVO);

}