package com.datamate.datamanagement.infrastructure.persistence.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.datamate.datamanagement.domain.model.dataset.DatasetFile;
import com.datamate.datamanagement.infrastructure.persistence.repository.dto.DatasetFileCount;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;

import java.util.List;

@Mapper
public interface DatasetFileMapper extends BaseMapper<DatasetFile> {
    DatasetFile findById(@Param("id") String id);
    List<DatasetFile> findByDatasetId(@Param("datasetId") String datasetId, RowBounds rowBounds);
    List<DatasetFile> findByDatasetIdAndStatus(@Param("datasetId") String datasetId, @Param("status") String status, RowBounds rowBounds);
    List<DatasetFile> findByDatasetIdAndFileType(@Param("datasetId") String datasetId, @Param("fileType") String fileType, RowBounds rowBounds);
    Long countByDatasetId(@Param("datasetId") String datasetId);
    Long countCompletedByDatasetId(@Param("datasetId") String datasetId);
    Long sumSizeByDatasetId(@Param("datasetId") String datasetId);
    Long countNonDerivedByDatasetId(@Param("datasetId") String datasetId);
    DatasetFile findByDatasetIdAndFileName(@Param("datasetId") String datasetId, @Param("fileName") String fileName);
    List<DatasetFile> findAllByDatasetId(@Param("datasetId") String datasetId);
    List<DatasetFile> findByCriteria(@Param("datasetId") String datasetId,
                                     @Param("fileType") String fileType,
                                     @Param("status") String status,
                                     RowBounds rowBounds);

    int updateFilePathPrefix(@Param("datasetId") String datasetId,
                             @Param("oldPrefix") String oldPrefix,
                             @Param("newPrefix") String newPrefix);

    /**
     * 查询数据集中所有作为衍生文件源文件的ID列表
     * 通过查询 metadata 中包含 derived_from_file_id 的字段值
     *
     * @param datasetId 数据集ID
     * @return 源文件ID列表
     */
    List<String> findSourceFileIdsWithDerivedFiles(@Param("datasetId") String datasetId);

    /**
     * 批量统计排除衍生文件后的文件数
     *
     * @param datasetIds 数据集ID列表
     * @return 文件数统计列表
     */
    List<DatasetFileCount> countNonDerivedByDatasetIds(@Param("datasetIds") List<String> datasetIds);

    /**
     * 查询指定逻辑路径的所有文件（包括所有状态）
     *
     * @param datasetId 数据集ID
     * @param logicalPath 逻辑路径
     * @return 文件列表
     */
    List<DatasetFile> findAllByDatasetIdAndLogicalPath(@Param("datasetId") String datasetId, @Param("logicalPath") String logicalPath);
}
