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.homework.*;
import com.lesingle.creation.entity.Homework;
import com.lesingle.creation.vo.homework.HomeworkDetailVO;
import com.lesingle.creation.vo.homework.HomeworkListVO;
import com.lesingle.creation.vo.homework.ReviewRuleVO;
import com.lesingle.creation.vo.homework.SubmissionVO;

import java.util.List;

/**
 * 作业服务接口
 */
public interface HomeworkService extends IService<Homework> {

    /**
     * 创建作业
     * @param dto 创建作业请求
     * @param tenantId 租户 ID
     * @param creatorId 创建人 ID
     * @return 作业详情
     */
    HomeworkDetailVO create(CreateHomeworkDTO dto, Long tenantId, Long creatorId);

    /**
     * 更新作业
     * @param id 作业 ID
     * @param dto 更新作业请求
     * @param tenantId 租户 ID
     * @return 作业详情
     */
    HomeworkDetailVO update(Long id, UpdateHomeworkDTO dto, Long tenantId);

    /**
     * 发布作业
     * @param id 作业 ID
     * @param tenantId 租户 ID
     * @return 作业详情
     */
    HomeworkDetailVO publish(Long id, Long tenantId);

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

    /**
     * 获取作业详情
     * @param id 作业 ID
     * @param tenantId 租户 ID
     * @return 作业详情
     */
    HomeworkDetailVO getDetail(Long id, Long tenantId);

    /**
     * 分页查询作业列表
     * @param queryDTO 查询参数
     * @param tenantId 租户 ID
     * @return 作业列表
     */
    Page<HomeworkListVO> pageQuery(HomeworkQueryDTO queryDTO, Long tenantId);

    /**
     * 提交作业
     * @param dto 提交作业请求
     * @param tenantId 租户 ID
     * @param studentId 学生 ID
     * @return 提交详情
     */
    SubmissionVO submit(SubmitHomeworkDTO dto, Long tenantId, Long studentId);

    /**
     * 批改作业
     * @param dto 批改作业请求
     * @param tenantId 租户 ID
     * @param reviewerId 批改人 ID
     * @return 提交详情
     */
    SubmissionVO review(ReviewHomeworkDTO dto, Long tenantId, Long reviewerId);

    /**
     * 获取作业提交列表
     * @param homeworkId 作业 ID
     * @param tenantId 租户 ID
     * @return 提交列表
     */
    List<SubmissionVO> getSubmissions(Long homeworkId, Long tenantId);

    /**
     * 创建评审规则
     * @param ruleName 规则名称
     * @param ruleType 规则类型
     * @param totalScore 总分
     * @param description 规则描述
     * @param tenantId 租户 ID
     * @return 评审规则
     */
    ReviewRuleVO createReviewRule(String ruleName, String ruleType,
                                   java.math.BigDecimal totalScore, String description, Long tenantId);

    /**
     * 获取评审规则列表
     * @param tenantId 租户 ID
     * @return 评审规则列表
     */
    List<ReviewRuleVO> getReviewRules(Long tenantId);

    /**
     * 获取可选的评审规则
     * @param tenantId 租户 ID
     * @return 评审规则列表
     */
    List<ReviewRuleVO> getReviewRulesForSelect(Long tenantId);

    /**
     * 更新评审规则
     * @param id 规则 ID
     * @param dto 更新请求
     * @param tenantId 租户 ID
     * @return 评审规则
     */
    ReviewRuleVO updateReviewRule(Long id, UpdateReviewRuleDTO dto, Long tenantId);

    /**
     * 删除评审规则
     * @param id 规则 ID
     * @param tenantId 租户 ID
     */
    void deleteReviewRule(Long id, Long tenantId);

    /**
     * 我的作业列表（学生端）
     * @param queryDTO 查询参数
     * @param userId 用户 ID
     * @param tenantId 租户 ID
     * @return 作业列表
     */
    Page<HomeworkListVO> getMyHomeworks(HomeworkQueryDTO queryDTO, Long userId, Long tenantId);

    /**
     * 取消发布作业
     * @param id 作业 ID
     * @param tenantId 租户 ID
     * @return 作业详情
     */
    HomeworkDetailVO unpublish(Long id, Long tenantId);

    /**
     * 获取提交记录列表
     * @param queryDTO 查询参数
     * @param tenantId 租户 ID
     * @return 提交记录列表
     */
    Page<SubmissionVO> getSubmissionsList(SubmissionQueryDTO queryDTO, Long tenantId);

    /**
     * 获取提交记录详情
     * @param id 提交 ID
     * @param tenantId 租户 ID
     * @return 提交详情
     */
    SubmissionVO getSubmissionDetail(Long id, Long tenantId);

    /**
     * 获取班级树结构
     * @param tenantId 租户 ID
     * @return 班级树
     */
    List<com.lesingle.creation.vo.school.ClassTreeNodeVO> getClassTree(Long tenantId);

    /**
     * 获取我的提交记录
     * @param homeworkId 作业 ID
     * @param userId 用户 ID
     * @param tenantId 租户 ID
     * @return 提交详情
     */
    SubmissionVO getMySubmission(Long homeworkId, Long userId, Long tenantId);

    /**
     * 提交评分
     * @param dto 评分请求
     * @param tenantId 租户 ID
     * @param reviewerId 批改人 ID
     * @return 提交详情
     */
    SubmissionVO createScore(CreateScoreDTO dto, Long tenantId, Long reviewerId);

    /**
     * 标记作品违规
     * @param submissionId 提交 ID
     * @param reason 原因
     * @param tenantId 租户 ID
     */
    void markViolation(Long submissionId, String reason, Long tenantId);

    /**
     * 重置评分
     * @param submissionId 提交 ID
     * @param tenantId 租户 ID
     */
    void resetScore(Long submissionId, Long tenantId);
}
