/*
 * 文 件 名:  CustomReportMapper
 * 版    权:  华设设计集团股份有限公司
 * 描    述:  <描述>
 * 修 改 人:  lvwenbin
 * 修改时间:  2026/1/30
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.ruoyi.ems.mapper;

import com.ruoyi.ems.domain.ReportDatasource;
import com.ruoyi.ems.domain.ReportField;
import com.ruoyi.ems.domain.ReportFieldCondition;
import com.ruoyi.ems.domain.ReportRelation;
import com.ruoyi.ems.domain.ReportTemplate;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 自定义报表Mapper接口
 *
 * @author ruoyi
 * @date 2026-01-30
 */
public interface CustomReportMapper {

    // ==================== 数据源管理 ====================

    /**
     * 查询数据源列表
     *
     * @param category 分类(可选)
     * @return 数据源列表
     */
    List<ReportDatasource> selectDatasourceList(@Param("category") String category);

    /**
     * 根据编码查询数据源
     *
     * @param dsCode 数据源编码
     * @return 数据源
     */
    ReportDatasource selectDatasourceByCode(@Param("dsCode") String dsCode);

    /**
     * 新增数据源
     *
     * @param datasource 数据源
     * @return 结果
     */
    int insertDatasource(ReportDatasource datasource);

    /**
     * 修改数据源
     *
     * @param datasource 数据源
     * @return 结果
     */
    int updateDatasource(ReportDatasource datasource);

    /**
     * 删除数据源
     *
     * @param dsCode 数据源编码
     * @return 结果
     */
    int deleteDatasource(@Param("dsCode") String dsCode);

    // ==================== 字段管理 ====================

    /**
     * 查询数据源的字段列表
     *
     * @param dsCode 数据源编码
     * @return 字段列表
     */
    List<ReportField> selectFieldsByDsCode(@Param("dsCode") String dsCode);

    /**
     * 根据编码查询字段
     *
     * @param dsCode    数据源编码
     * @param fieldCode 字段编码
     * @return 字段
     */
    ReportField selectField(@Param("dsCode") String dsCode, @Param("fieldCode") String fieldCode);

    /**
     * 新增字段配置
     *
     * @param field 字段
     * @return 结果
     */
    int insertField(ReportField field);

    /**
     * 批量新增字段配置
     *
     * @param fields 字段列表
     * @return 结果
     */
    int insertFieldBatch(@Param("list") List<ReportField> fields);

    /**
     * 修改字段配置
     *
     * @param field 字段
     * @return 结果
     */
    int updateField(ReportField field);

    /**
     * 删除字段配置
     *
     * @param dsCode    数据源编码
     * @param fieldCode 字段编码
     * @return 结果
     */
    int deleteField(@Param("dsCode") String dsCode, @Param("fieldCode") String fieldCode);

    /**
     * 删除数据源下所有字段
     *
     * @param dsCode 数据源编码
     * @return 结果
     */
    int deleteFieldsByDsCode(@Param("dsCode") String dsCode);

    // ==================== 字段条件管理 ====================

    /**
     * 查询字段的条件列表
     *
     * @param dsCode    数据源编码
     * @param fieldCode 字段编码
     * @return 条件列表
     */
    List<ReportFieldCondition> selectFieldConditions(@Param("dsCode") String dsCode, @Param("fieldCode") String fieldCode);

    /**
     * 查询数据源所有字段条件
     *
     * @param dsCode 数据源编码
     * @return 条件列表
     */
    List<ReportFieldCondition> selectAllFieldConditions(@Param("dsCode") String dsCode);

    /**
     * 新增字段条件
     *
     * @param condition 条件
     * @return 结果
     */
    int insertFieldCondition(ReportFieldCondition condition);

    /**
     * 批量新增字段条件
     *
     * @param conditions 条件列表
     * @return 结果
     */
    int insertFieldConditionBatch(@Param("list") List<ReportFieldCondition> conditions);

    /**
     * 删除字段条件
     *
     * @param dsCode    数据源编码
     * @param fieldCode 字段编码
     * @return 结果
     */
    int deleteFieldConditions(@Param("dsCode") String dsCode, @Param("fieldCode") String fieldCode);

    // ==================== 关联管理 ====================

    /**
     * 查询数据源的关联配置
     *
     * @param dsCode 数据源编码
     * @return 关联列表
     */
    List<ReportRelation> selectRelationsByDsCode(@Param("dsCode") String dsCode);

    /**
     * 根据编码查询关联
     *
     * @param dsCode       数据源编码
     * @param relationCode 关联编码
     * @return 关联
     */
    ReportRelation selectRelation(@Param("dsCode") String dsCode, @Param("relationCode") String relationCode);

    /**
     * 新增关联配置
     *
     * @param relation 关联
     * @return 结果
     */
    int insertRelation(ReportRelation relation);

    /**
     * 修改关联配置
     *
     * @param relation 关联
     * @return 结果
     */
    int updateRelation(ReportRelation relation);

    /**
     * 删除关联配置
     *
     * @param dsCode       数据源编码
     * @param relationCode 关联编码
     * @return 结果
     */
    int deleteRelation(@Param("dsCode") String dsCode, @Param("relationCode") String relationCode);

    /**
     * 删除数据源下所有关联
     *
     * @param dsCode 数据源编码
     * @return 结果
     */
    int deleteRelationsByDsCode(@Param("dsCode") String dsCode);

    // ==================== 字段关联映射管理 ====================

    /**
     * 查询字段的关联编码列表
     *
     * @param dsCode    数据源编码
     * @param fieldCode 字段编码
     * @return 关联编码列表
     */
    List<String> selectFieldRelationCodes(@Param("dsCode") String dsCode, @Param("fieldCode") String fieldCode);

    /**
     * 查询数据源所有字段关联映射
     *
     * @param dsCode 数据源编码
     * @return 字段关联映射列表
     */
    List<Map<String, String>> selectAllFieldRelations(@Param("dsCode") String dsCode);

    /**
     * 新增字段关联映射
     *
     * @param dsCode       数据源编码
     * @param fieldCode    字段编码
     * @param relationCode 关联编码
     * @return 结果
     */
    int insertFieldRelation(@Param("dsCode") String dsCode, @Param("fieldCode") String fieldCode, @Param("relationCode") String relationCode);

    /**
     * 删除字段关联映射
     *
     * @param dsCode    数据源编码
     * @param fieldCode 字段编码
     * @return 结果
     */
    int deleteFieldRelations(@Param("dsCode") String dsCode, @Param("fieldCode") String fieldCode);

    // ==================== 模板管理 ====================

    /**
     * 查询模板列表
     *
     * @param query 查询条件
     * @return 模板列表
     */
    List<ReportTemplate> selectTemplateList(ReportTemplate query);

    /**
     * 根据编码查询模板
     *
     * @param templateCode 模板编码
     * @return 模板
     */
    ReportTemplate selectTemplateByCode(@Param("templateCode") String templateCode);

    /**
     * 检查模板编码是否存在
     *
     * @param templateCode 模板编码
     * @return 数量
     */
    int checkTemplateCodeExists(@Param("templateCode") String templateCode);

    /**
     * 新增模板
     *
     * @param template 模板
     * @return 结果
     */
    int insertTemplate(ReportTemplate template);

    /**
     * 修改模板
     *
     * @param template 模板
     * @return 结果
     */
    int updateTemplate(ReportTemplate template);

    /**
     * 删除模板
     *
     * @param templateCode 模板编码
     * @return 结果
     */
    int deleteTemplate(@Param("templateCode") String templateCode);

    /**
     * 增加模板使用次数
     *
     * @param templateCode 模板编码
     * @return 结果
     */
    int incrementTemplateUseCount(@Param("templateCode") String templateCode);

    // ==================== 动态查询执行 ====================

    /**
     * 执行动态查询
     *
     * @param sql    SQL语句
     * @param params 参数
     * @return 结果列表
     */
    List<Map<String, Object>> executeDynamicQuery(@Param("sql") String sql, @Param("params") Map<String, Object> params);

    /**
     * 执行动态计数查询
     *
     * @param sql    SQL语句
     * @param params 参数
     * @return 计数结果
     */
    Long executeDynamicCount(@Param("sql") String sql, @Param("params") Map<String, Object> params);

    /**
     * 执行动态汇总查询
     *
     * @param sql    SQL语句
     * @param params 参数
     * @return 汇总结果
     */
    Map<String, Object> executeDynamicSummary(@Param("sql") String sql, @Param("params") Map<String, Object> params);
}