package com.red.circle.wallet.infra.database.rds.service.salary;

import com.red.circle.framework.mybatis.service.BaseService;
import com.red.circle.wallet.inner.model.enums.SalaryType;
import com.red.circle.wallet.infra.database.rds.entity.salary.SalaryAccountBalance;

/**
 * 工资账户余额服务.
 */
public interface SalaryAccountBalanceService extends BaseService<SalaryAccountBalance> {

  /**
   * 初始化账户.
   *
   * @param sysOrigin 系统来源
   * @param userId 用户ID
   * @param salaryType 工资类型
   */
  void init(String sysOrigin, Long userId, SalaryType salaryType);

  /**
   * 查询余额（分）.
   *
   * @param userId 用户ID
   * @param salaryType 工资类型
   * @return 余额（分）
   */
  Long getBalance(Long userId, SalaryType salaryType);

  /**
   * 查询可用余额（分）.
   *
   * @param userId 用户ID
   * @param salaryType 工资类型
   * @return 可用余额（分）
   */
  Long getAvailableBalance(Long userId, SalaryType salaryType);

  /**
   * 增加收入.
   *
   * @param userId 用户ID
   * @param salaryType 工资类型
   * @param amount 金额（分）
   * @return 是否成功
   */
  boolean incrIncome(Long userId, SalaryType salaryType, Long amount);

  /**
   * 增加支出.
   *
   * @param userId 用户ID
   * @param salaryType 工资类型
   * @param amount 金额（分）
   * @return 是否成功
   */
  boolean incrExpenditure(Long userId, SalaryType salaryType, Long amount);

  /**
   * 冻结金额.
   *
   * @param userId 用户ID
   * @param salaryType 工资类型
   * @param amount 金额（分）
   * @param version 版本号
   * @return 是否成功
   */
  boolean freezeAmount(Long userId, SalaryType salaryType, Long amount, Integer version);

  /**
   * 解冻金额.
   *
   * @param userId 用户ID
   * @param salaryType 工资类型
   * @param amount 金额（分）
   * @param version 版本号
   * @return 是否成功
   */
  boolean unfreezeAmount(Long userId, SalaryType salaryType, Long amount, Integer version);

  /**
   * 根据用户ID和工资类型查询账户.
   *
   * @param userId 用户ID
   * @param salaryType 工资类型
   * @return 账户信息
   */
  SalaryAccountBalance getByUserIdAndType(Long userId, SalaryType salaryType);
}
