package com.lesingle.creation.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lesingle.creation.dto.registration.*;
import com.lesingle.creation.entity.ContestRegistration;
import com.lesingle.creation.vo.registration.RegistrationStatsVO;
import com.lesingle.creation.vo.registration.RegistrationVO;

import java.util.List;

/**
 * 竞赛报名服务接口
 */
public interface ContestRegistrationService {

    /**
     * 创建报名
     * @param dto 创建报名请求
     * @param tenantId 租户 ID
     * @param creatorId 创建人 ID
     * @return 报名记录
     */
    RegistrationVO create(CreateRegistrationDTO dto, Long tenantId, Long creatorId);

    /**
     * 报名统计
     * @param contestId 活动 ID（可选）
     * @return 统计数据
     */
    RegistrationStatsVO getStats(Long contestId);

    /**
     * 分页查询报名列表
     * @param queryDTO 查询参数
     * @param tenantId 租户 ID
     * @return 报名列表
     */
    Page<RegistrationVO> pageQuery(RegistrationQueryDTO queryDTO, Long tenantId);

    /**
     * 获取报名详情
     * @param id 报名 ID
     * @param tenantId 租户 ID
     * @return 报名详情
     */
    RegistrationVO getDetail(Long id, Long tenantId);

    /**
     * 审核报名
     * @param id 报名 ID
     * @param dto 审核请求
     * @param operatorId 操作人 ID
     * @param tenantId 租户 ID
     * @return 报名记录
     */
    RegistrationVO review(Long id, ReviewRegistrationDTO dto, Long operatorId, Long tenantId);

    /**
     * 删除报名
     * @param id 报名 ID
     * @param tenantId 租户 ID
     */
    void delete(Long id, Long tenantId);

    /**
     * 添加指导老师
     * @param registrationId 报名 ID
     * @param teacherUserId 老师用户 ID
     * @param tenantId 租户 ID
     * @param creatorId 创建人 ID
     * @return 报名记录
     */
    RegistrationVO addTeacher(Long registrationId, Long teacherUserId, Long tenantId, Long creatorId);

    /**
     * 移除指导老师
     * @param registrationId 报名 ID
     * @param teacherUserId 老师用户 ID
     * @param tenantId 租户 ID
     */
    void removeTeacher(Long registrationId, Long teacherUserId, Long tenantId);

    /**
     * 获取用户在某活动中的报名记录
     * @param contestId 活动 ID
     * @param userId 用户 ID
     * @return 报名记录
     */
    RegistrationVO getMyRegistration(Long contestId, Long userId);
}
