package com.ruoyi.ccdi.project.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectImportHistoryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSaveDTO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectHistoryListItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectStatusCountsVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectVO;

import java.util.List;

/**
 * 项目Service接口
 *
 * @author ruoyi
 */
public interface ICcdiProjectService {
    /**
     * 创建项目
     *
     * @param dto 项目保存DTO
     * @return 项目VO
     */
    CcdiProjectVO createProject(CcdiProjectSaveDTO dto);

    /**
     * 更新项目
     *
     * @param dto 项目更新DTO
     * @return 项目VO
     */
    CcdiProjectVO updateProject(CcdiProjectSaveDTO dto);

    /**
     * 删除项目
     *
     * @param projectId 项目ID
     * @param operator 操作人
     * @return 是否成功
     */
    boolean deleteProject(Long projectId, String operator);

    /**
     * 恢复已删除项目
     *
     * @param projectId 项目ID
     * @param operator 操作人
     */
    void restoreProject(Long projectId, String operator);

    /**
     * 查询项目详情
     *
     * @param projectId 项目ID
     * @return 项目VO
     */
    CcdiProjectVO getProjectById(Long projectId);

    /**
     * 分页查询项目列表
     *
     * @param page 分页对象
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    Page<CcdiProjectVO> selectProjectPage(Page<CcdiProjectVO> page, CcdiProjectQueryDTO queryDTO);

    /**
     * 查询历史项目列表
     *
     * @param queryDTO 查询条件
     * @return 历史项目列表
     */
    List<CcdiProjectHistoryListItemVO> listHistoryProjects(CcdiProjectQueryDTO queryDTO);

    /**
     * 从历史项目导入
     *
     * @param dto 导入参数
     * @param operator 操作人
     * @return 新建项目
     */
    CcdiProjectVO importFromHistory(CcdiProjectImportHistoryDTO dto, String operator);

    /**
     * 查询各状态的项目总数（不受搜索条件影响）
     *
     * @return 状态统计
     */
    CcdiProjectStatusCountsVO getStatusCounts();

    /**
     * 归档项目
     *
     * @param projectId 项目ID
     * @param operator 操作人
     */
    void archiveProject(Long projectId, String operator);

    /**
     * 更新项目状态
     *
     * @param projectId 项目ID
     * @param status 状态编码
     * @param operator 操作人
     */
    void updateProjectStatus(Long projectId, String status, String operator);

    /**
     * 校验项目是否允许进入打标流程
     *
     * @param projectId 项目ID
     */
    void ensureProjectCanStartTagging(Long projectId);

    /**
     * 校验项目是否未归档
     *
     * @param projectId 项目ID
     * @param message 拒绝文案
     */
    void ensureProjectNotArchived(Long projectId, String message);

    /**
     * 校验项目是否允许写入
     *
     * @param projectId 项目ID
     * @param message 拒绝文案
     */
    void ensureProjectWritable(Long projectId, String message);
}
