package shop.alien.mapper.storePlantform;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import shop.alien.entity.storePlatform.StoreOperationalActivitySignup;
import shop.alien.entity.storePlatform.vo.StoreOperationalActivityMySignupVo;

import java.util.List;

/**
 * 运营活动报名 Mapper 接口
 *
 * @author system
 * @since 2025-01-XX
 */
@Mapper
public interface StoreOperationalActivitySignupMapper extends BaseMapper<StoreOperationalActivitySignup> {

    /**
     * 根据活动ID查询报名列表（仅未删除）。
     *
     * @param activityId 活动ID
     * @return 报名列表
     */
    List<StoreOperationalActivitySignup> selectByActivityId(@Param("activityId") Integer activityId);

    /**
     * 统计活动当前报名人数（待审核+通过，未删除）。
     *
     * @param activityId 活动ID
     * @return 报名人数
     */
    Integer countSignupByActivityId(@Param("activityId") Integer activityId);

    /**
     * 统计活动当前通过人数（通过状态，未删除）。
     *
     * @param activityId 活动ID
     * @return 通过人数
     */
    Integer countApprovedByActivityId(@Param("activityId") Integer activityId);

    /**
     * 统计用户是否已通过报名。
     *
     * @param activityId 活动ID
     * @param userId     用户ID
     * @return 报名数量
     */
    Integer countApprovedByActivityAndUser(@Param("activityId") Integer activityId,
                                           @Param("userId") Integer userId);

    /**
     * 统计同一活动同一手机号已报名数量（未删除，待审核或通过）。
     *
     * @param activityId 活动ID
     * @param phone      手机号
     * @return 报名数量
     */
    Integer countByActivityIdAndPhone(@Param("activityId") Integer activityId,
                                      @Param("phone") String phone);

    /**
     * 统计用户是否已报名（待审核/通过）。
     *
     * @param activityId 活动ID
     * @param userId     用户ID
     * @return 报名数量
     */
    Integer countSignedUpByActivityAndUser(@Param("activityId") Integer activityId,
                                           @Param("userId") Integer userId);

    /**
     * 获取用户最新报名状态。
     *
     * @param activityId 活动ID
     * @param userId     用户ID
     * @return 报名状态
     */
    Integer selectLatestSignupStatus(@Param("activityId") Integer activityId,
                                     @Param("userId") Integer userId);

    /**
     * 查询我的报名列表。
     *
     * @param userId 用户ID
     * @return 报名列表
     */
    List<StoreOperationalActivityMySignupVo> selectMySignups(@Param("userId") Integer userId);

    IPage<StoreOperationalActivitySignup> selectAll(IPage<StoreOperationalActivitySignup> page, @Param(Constants.WRAPPER) LambdaQueryWrapper<StoreOperationalActivitySignup> wrapper);
}
