package com.lesingle.creation.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lesingle.creation.dto.contest.*;
import com.lesingle.creation.entity.Contest;
import com.lesingle.creation.vo.contest.*;

/**
 * 竞赛服务接口
 */
public interface ContestService extends IService<Contest> {

    /**
     * 创建竞赛
     *
     * @param dto 创建竞赛 DTO
     * @param creatorId 创建人 ID
     * @return 竞赛详情 VO
     */
    ContestDetailVO create(CreateContestDTO dto, Long creatorId);

    /**
     * 分页查询竞赛列表
     *
     * @param queryDTO 查询参数
     * @param tenantId 租户 ID
     * @return 竞赛列表分页数据
     */
    Page<ContestListVO> pageList(ContestQueryDTO queryDTO, Long tenantId);

    /**
     * 根据 ID 查询竞赛详情
     *
     * @param id 竞赛 ID
     * @param tenantId 租户 ID
     * @return 竞赛详情 VO
     */
    ContestDetailVO detail(Long id, Long tenantId);

    /**
     * 更新竞赛
     *
     * @param id 竞赛 ID
     * @param dto 更新竞赛 DTO
     * @param modifierId 修改人 ID
     * @return 竞赛详情 VO
     */
    ContestDetailVO update(Long id, UpdateContestDTO dto, Long modifierId);

    /**
     * 发布/取消发布竞赛
     *
     * @param id 竞赛 ID
     * @param contestState 竞赛状态
     * @param modifierId 修改人 ID
     * @return 竞赛详情 VO
     */
    ContestDetailVO publish(Long id, String contestState, Long modifierId);

    /**
     * 标记竞赛为完结
     *
     * @param id 竞赛 ID
     * @param modifierId 修改人 ID
     * @return 竞赛详情 VO
     */
    ContestDetailVO finish(Long id, Long modifierId);

    /**
     * 重新开启已完结的竞赛
     *
     * @param id 竞赛 ID
     * @param modifierId 修改人 ID
     * @return 竞赛详情 VO
     */
    ContestDetailVO reopen(Long id, Long modifierId);

    /**
     * 删除竞赛
     *
     * @param id 竞赛 ID
     */
    void delete(Long id);

    /**
     * 获取竞赛统计信息
     *
     * @return 统计信息 VO
     */
    ContestStatsVO getStats();

    /**
     * 根据 ID 查询竞赛（不检查权限）
     *
     * @param id 竞赛 ID
     * @return 竞赛实体
     */
    Contest getById(Long id);

    /**
     * 查询我参与的活动列表
     *
     * @param queryDTO 查询参数
     * @param userId 用户 ID
     * @param tenantId 租户 ID
     * @return 竞赛列表分页数据
     */
    Page<ContestListVO> myContests(ContestQueryDTO queryDTO, Long userId, Long tenantId);
}
