package shop.alien.store.service;

import shop.alien.entity.storePlatform.vo.StoreOperationalActivityDetailVo;
import shop.alien.entity.storePlatform.vo.StoreOperationalActivitySignupCheckVo;
import shop.alien.entity.storePlatform.vo.StoreOperationalActivityMySignupVo;
import shop.alien.store.dto.StoreOperationalActivitySignupDto;
import java.util.List;

/**
 * 用户端运营活动服务
 *
 * @author system
 * @since 2025-01-XX
 */
public interface StoreOperationalActivityService {

    /**
     * 查询活动详情。
     * <p>
     * 说明：
     * 1. id 为活动主键，userId 用于判断报名相关状态。
     * 2. 若活动不存在，返回 null。
     * </p>
     *
     * @param id 活动ID
     * @param userId 用户ID
     * @return 活动详情
     */
    StoreOperationalActivityDetailVo getActivityDetail(Integer id, Integer userId);

    /**
     * 查询活动详情。
     * <p>
     * 说明：
     * 1. id 为活动主键，userId 用于判断报名相关状态。
     * 2. 若活动不存在，返回 null。
     * </p>
     *
     * @param id 活动ID
     * @param userId 用户ID
     * @return 活动详情
     */
    StoreOperationalActivityDetailVo getActivityDetailForPlatform(Integer id, Integer userId);

    /**
     * 报名校验：是否已满、是否已成功报名。
     *
     * @param activityId 活动ID
     * @param userId     用户ID
     * @return 校验结果
     */
    StoreOperationalActivitySignupCheckVo checkSignup(Integer activityId, Integer userId);

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

    /**
     * 删除报名及其成果。
     * <p>
     * 规则：
     * 1. 必须传入活动ID与报名ID。
     * 2. 报名必须存在且属于该活动。
     * 3. 删除报名信息与关联成果信息（逻辑删除）。
     * </p>
     *
     * @param activityId 活动ID
     * @param signupId 报名ID
     * @return 是否删除成功
     */
    boolean deleteSignup(Integer activityId, Integer signupId);

    /**
     * 活动报名
     *
     * @param dto 报名请求
     * @return 是否成功
     */
    boolean signup(StoreOperationalActivitySignupDto dto);
}
