package com.kexue.skills.mapper;

import com.kexue.skills.entity.Account;
import com.kexue.skills.entity.dto.AccountDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

/**
 * (Account)表数据库访问层
 *
 * @author 王志维
 * @since 2025-02-21 23:01:48
 */
@Mapper
public interface AccountMapper {
    /**
     * 分页查询
     *
     * @param queryDto 筛选条件
     * @return 查询结果
     */
    List<Account> getPageList(AccountDto queryDto);

    /**
     * 查询列表
     *
     * @param queryDto 筛选条件
     * @return 查询结果
     */
    List<Account> getList(AccountDto queryDto);

    /**
     * 通过主键查询单条数据
     *
     * @param accountId 主键
     * @return 实例对象
     */
    Account queryById(Long accountId);

    /**
     * 通过用户ID查询账户
     *
     * @param userId 用户ID
     * @return 实例对象
     */
    Account queryByUserId(Long userId);

    /**
     * 新增数据
     *
     * @param account 实例对象
     * @return 影响行数
     */
    int insert(Account account);

    /**
     * 更新数据
     *
     * @param account 实例对象
     * @return 影响行数
     */
    int update(Account account);

    /**
     * 更新账户余额
     *
     * @param userId 用户ID
     * @param amount 变动金额
     * @param type 变动类型：1.增加 2.减少
     * @return 影响行数
     */
    int updateBalance(@Param("userId") Long userId, @Param("amount") BigDecimal amount, @Param("type") Integer type);

    /**
     * 更新冻结金额
     *
     * @param userId 用户ID
     * @param amount 变动金额
     * @param type 变动类型：1.增加 2.减少
     * @return 影响行数
     */
    int updateFrozenAmount(@Param("userId") Long userId, @Param("amount") BigDecimal amount, @Param("type") Integer type);

    /**
     * 通过主键逻辑删除
     *
     * @param accountId 主键
     * @return 影响行数
     */
    int logicDeleteById(@Param("accountId") Long accountId, @Param("updateBy") String updateBy);

    /**
     * 通过主键物理删除
     *
     * @param accountId 主键
     * @return 影响行数
     */
    int deleteById(Long accountId);

}