package com.microservices.zone.member.mapper;

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

import java.util.List;

/**
 * 专区积分流水Mapper接口（合并事件+流水）
 *
 * @author otto
 */
@Mapper
public interface ZonePointsTransactionMapper {
    /**
     * 查询专区积分流水
     *
     * @param id 专区积分流水主键
     * @return 专区积分流水
     */
    public ZonePointsTransaction selectZonePointsTransactionById(Long id);

    /**
     * 查询专区积分流水列表
     *
     * @param zonePointsTransaction 专区积分流水
     * @return 专区积分流水集合
     */
    public List<ZonePointsTransaction> selectZonePointsTransactionList(ZonePointsTransaction zonePointsTransaction);

    /**
     * 新增专区积分流水
     *
     * @param zonePointsTransaction 专区积分流水
     * @return 结果
     */
    public int insertZonePointsTransaction(ZonePointsTransaction zonePointsTransaction);

    /**
     * 修改专区积分流水
     *
     * @param zonePointsTransaction 专区积分流水
     * @return 结果
     */
    public int updateZonePointsTransaction(ZonePointsTransaction zonePointsTransaction);

    /**
     * 删除专区积分流水
     *
     * @param id 专区积分流水主键
     * @return 结果
     */
    public int deleteZonePointsTransactionById(Long id);

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

    /**
     * 根据事件ID查询流水列表
     *
     * @param eventId 事件ID
     * @return 专区积分流水列表
     */
    List<ZonePointsTransaction> selectZonePointsTransactionByEventId(@Param("eventId") String eventId);

    /**
     * 根据账户ID查询流水列表
     *
     * @param accountId 积分账户ID
     * @return 专区积分流水列表
     */
    List<ZonePointsTransaction> selectZonePointsTransactionByAccountId(@Param("accountId") Long accountId);

    /**
     * 根据用户ID和专区ID查询流水列表
     *
     * @param userId 用户ID
     * @param zoneId 专区ID
     * @return 专区积分流水列表
     */
    List<ZonePointsTransaction> selectZonePointsTransactionByUserIdAndZoneId(@Param("userId") Long userId, @Param("zoneId") Long zoneId);

    /**
     * 根据专区ID获取当前用户积分明细（分页）
     *
     * @param zoneId 专区ID
     * @param userId 用户ID
     * @param transactionType 交易类型（可选）
     * @return 专区积分流水列表
     */
    List<ZonePointsTransaction> selectMyPointsTransactionDetailsByZone(@Param("zoneId") Long zoneId, @Param("userId") Long userId, @Param("transactionType") String transactionType);

    /**
     * 查询当前用户流水列表（合并后直接从流水表查询，包含所有业务字段）
     *
     * @param userId 用户ID
     * @param zoneId 专区ID
     * @return 专区积分流水列表
     */
    List<ZonePointsTransaction> selectCurrentUserTransactionWithEvent(@Param("userId") Long userId, @Param("zoneId") Long zoneId);

    /**
     * 统计指定事件类型、来源ID、账户ID的流水记录数（用于幂等校验）
     */
    int countByEventTypeAndSourceAndUser(@Param("eventType") String eventType,
                                         @Param("sourceId") Long sourceId,
                                         @Param("accountId") Long accountId);

    /**
     * 统计指定事件类型、专区ID、用户ID的流水记录数（用于幂等校验，JOIN account 获取 zoneId）
     */
    int countByEventTypeAndZoneAndUser(@Param("eventType") String eventType,
                                       @Param("zoneId") Long zoneId,
                                       @Param("userId") Long userId);

    /**
     * 根据专区ID、用户ID和事件类型查询积分流水（限制一条，JOIN account 获取 zoneId/userId）
     */
    ZonePointsTransaction selectPointsTransactionOne(@Param("zoneId") Long zoneId,
                                                     @Param("userId") Long userId,
                                                     @Param("eventType") String eventType);
}