package com.microservices.zone.member.mapper;

import com.microservices.zone.member.domain.points.ZonePointsDoc;
import com.microservices.zone.member.domain.vo.ZonePointsTopDocVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 专区积分文档Mapper接口
 *
 * @author otto
 */
@Mapper
public interface ZonePointsDocMapper {

    /**
     * 查询专区积分文档
     *
     * @param id 主键ID
     * @return 专区积分文档
     */
    ZonePointsDoc selectZonePointsDocById(Long id);

    /**
     * 查询专区积分文档
     *
     * @param zoneId 专区ID
     * @param docId  文章ID
     * @return 专区积分文档
     */
    ZonePointsDoc selectZonePointsDocByZoneIdAndDocId(@Param("zoneId") Long zoneId, @Param("docId") Long docId);

    /**
     * 新增专区积分文档
     *
     * @param zonePointsDoc 专区积分文档
     * @return 结果
     */
    int insertZonePointsDoc(ZonePointsDoc zonePointsDoc);

    /**
     * 修改专区积分文档
     *
     * @param zonePointsDoc 专区积分文档
     * @return 结果
     */
    int updateZonePointsDoc(ZonePointsDoc zonePointsDoc);

    /**
     * 增加触发次数（原子操作）
     *
     * @param id         主键ID
     * @param addCount 增加的触发次数
     * @return 影响行数
     */
    int incrementTriggerCount(@Param("id") Long id, @Param("addCount") int addCount);

    /**
     * 检查用户在指定专区下是否已有置顶文章
     *
     * @param zoneId 专区ID
     * @param userId 用户ID
     * @return 置顶文章记录数
     */
    int hasPointsTopByZoneIdAndUserId(@Param("zoneId") Long zoneId, @Param("userId") Long userId);

    /**
     * 更新文章的积分置顶状态
     *
     * @param id          主键ID
     * @param isPointsTop 是否置顶
     * @return 影响行数
     */
    int updatePointsTopStatus(@Param("id") Long id, @Param("isPointsTop") Boolean isPointsTop);

    /**
     * 查询用户在指定专区下的置顶文章
     *
     * @param zoneId 专区ID
     * @param userId 用户ID
     * @return 置顶文章记录
     */
    ZonePointsDoc selectPointsTopByZoneIdAndUserId(@Param("zoneId") Long zoneId, @Param("userId") Long userId);

    /**
     * 查询专区下置顶文章列表（左联 cms_doc，过期时间晚于当前时间，用于前台展示）
     *
     * @param zoneId 专区ID
     * @return 置顶文章列表（含文章名称和概要）
     */
    List<ZonePointsTopDocVo> selectTopDocList(@Param("zoneId") Long zoneId);

    /**
     * 批量取消已过期的积分置顶（is_points_top=1 且 expiry_time 早于当前时间）
     *
     * @return 影响行数
     */
    int updateExpiredPointsTop();
}