package com.microservices.zone.member.mapper;

import com.microservices.zone.member.domain.points.ZonePointsAccount;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 专区积分账户Mapper接口
 *
 * @author otto
 */
@Mapper
public interface ZonePointsAccountMapper {
    /**
     * 查询专区积分账户
     *
     * @param id 专区积分账户主键
     * @return 专区积分账户
     */
    public ZonePointsAccount selectZonePointsAccountById(Long id);

    /**
     * 查询专区积分账户列表
     *
     * @param zonePointsAccount 专区积分账户
     * @return 专区积分账户集合
     */
    public List<ZonePointsAccount> selectZonePointsAccountList(ZonePointsAccount zonePointsAccount);

    /**
     * 新增专区积分账户
     *
     * @param zonePointsAccount 专区积分账户
     * @return 结果
     */
    public int insertZonePointsAccount(ZonePointsAccount zonePointsAccount);

    /**
     * 修改专区积分账户
     *
     * @param zonePointsAccount 专区积分账户
     * @return 结果
     */
    public int updateZonePointsAccount(ZonePointsAccount zonePointsAccount);

    /**
     * 删除专区积分账户
     *
     * @param id 专区积分账户主键
     * @return 结果
     */
    public int deleteZonePointsAccountById(Long id);

    /**
     * 批量删除专区积分账户
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteZonePointsAccountByIds(Long[] ids);

    /**
     * 根据用户ID和专区ID查询积分账户
     *
     * @param userId 用户ID
     * @param zoneId 专区ID
     * @return 专区积分账户
     */
    ZonePointsAccount selectZonePointsAccountByUserIdAndZoneId(@Param("userId") Long userId, @Param("zoneId") Long zoneId);

    /**
     * 根据会员ID查询积分账户列表
     *
     * @param memberId 专区会员ID
     * @return 专区积分账户列表
     */
    List<ZonePointsAccount> selectZonePointsAccountByMemberId(@Param("memberId") Long memberId);

    /**
     * 锁定行获取账户信息（用于并发安全更新）
     *
     * @param id 账户ID
     * @return 专区积分账户
     */
    ZonePointsAccount selectZonePointsAccountByIdForUpdate(Long id);

    /**
     * 原子增加积分（并发安全）
     *
     * @param id        账户ID
     * @param addPoints 增加的积分
     * @return 影响行数
     */
    int addPointsAtomic(@Param("id") Long id, @Param("addPoints") int addPoints);

    /**
     * 原子扣除积分（并发安全）
     *
     * @param id           账户ID
     * @param deductPoints 扣除的积分
     * @return 影响行数
     */
    int deductPointsAtomic(@Param("id") Long id, @Param("deductPoints") int deductPoints);

    int freezePointsAtomic(@Param("id") Long id, @Param("freezePoints") int freezePoints);

    /**
     * 原子解冻积分（并发安全）
     *
     * @param id           账户ID
     * @param unfreezePoints 解冻的积分
     * @return 影响行数
     */
    int unfreezePointsAtomic(@Param("id") Long id, @Param("unfreezePoints") int unfreezePoints);

    /**
     * 原子扣减冻结积分（并发安全），用于申请通过时从冻结积分中正式扣除
     *
     * @param id           账户ID
     * @param deductPoints 扣减的积分
     * @return 影响行数
     */
    int deductFrozenPointsAtomic(@Param("id") Long id, @Param("deductPoints") int deductPoints);
}