package com.ruoyi.ccdi.project.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.project.domain.CcdiProject;
import com.ruoyi.ccdi.project.domain.ProjectAccessScope;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectQueryDTO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectHistoryListItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 项目Mapper接口
 *
 * @author ruoyi
 */
@Mapper
public interface CcdiProjectMapper extends BaseMapper<CcdiProject> {
    /**
     * 分页查询项目列表
     *
     * @param page 分页对象
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    Page<CcdiProjectVO> selectProjectPage(Page<CcdiProjectVO> page,
                                          @Param("queryDTO") CcdiProjectQueryDTO queryDTO,
                                          @Param("scope") ProjectAccessScope scope);

    /**
     * 查询历史项目列表
     *
     * @param queryDTO 查询条件
     * @return 历史项目列表
     */
    List<CcdiProjectHistoryListItemVO> selectHistoryProjects(@Param("queryDTO") CcdiProjectQueryDTO queryDTO,
                                                             @Param("scope") ProjectAccessScope scope);

    /**
     * 业务逻辑删除项目，仅更新项目主表状态和删除标记。
     *
     * @param projectId 项目ID
     * @param operator 操作人
     * @return 更新行数
     */
    int markProjectDeleted(@Param("projectId") Long projectId, @Param("operator") String operator);

    /**
     * 恢复已删除项目为已完成。
     *
     * @param projectId 项目ID
     * @param operator 操作人
     * @return 更新行数
     */
    int restoreDeletedProject(@Param("projectId") Long projectId, @Param("operator") String operator);

    /**
     * 统计已删除项目数量。
     *
     * @param scope 项目访问范围
     * @return 已删除项目数量
     */
    Long selectDeletedProjectCount(@Param("scope") ProjectAccessScope scope);

    /**
     * 更新项目总人数与风险人数
     *
     * @param projectId 项目ID
     * @param targetCount 总人数
     * @param highRiskCount 高风险人数
     * @param mediumRiskCount 中风险人数
     * @param lowRiskCount 低风险人数
     * @param updateBy 更新人
     * @return 更新行数
     */
    int updateRiskCountsByProjectId(@Param("projectId") Long projectId,
                                    @Param("targetCount") Integer targetCount,
                                    @Param("highRiskCount") Integer highRiskCount,
                                    @Param("mediumRiskCount") Integer mediumRiskCount,
                                    @Param("lowRiskCount") Integer lowRiskCount,
                                    @Param("updateBy") String updateBy);
}
