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

import com.ruoyi.ems.domain.ReportDatasource;
import com.ruoyi.ems.domain.ReportField;
import com.ruoyi.ems.domain.ReportFieldCondition;
import com.ruoyi.ems.domain.ReportQueryConfig;
import com.ruoyi.ems.domain.ReportRelation;
import com.ruoyi.ems.domain.ReportTemplate;
import com.ruoyi.ems.model.ReportQueryResult;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

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

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

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

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

    /**
     * 获取数据源详情（包含字段、条件、关联配置）
     *
     * @param dsCode 数据源编码
     * @return 数据源详情
     */
    ReportDatasource selectDatasourceDetail(String dsCode);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * 保存模板
     *
     * @param template 模板
     * @return 结果
     */
    int saveTemplate(ReportTemplate template);

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

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

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

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

    /**
     * 执行报表查询
     *
     * @param queryConfig 查询配置
     * @return 查询结果
     */
    ReportQueryResult executeQuery(ReportQueryConfig queryConfig);

    /**
     * 执行汇总查询
     *
     * @param queryConfig 查询配置
     * @return 汇总数据
     */
    Map<String, Object> executeSummaryQuery(ReportQueryConfig queryConfig);

    /**
     * 导出到Excel
     *
     * @param response 响应对象
     * @param result   查询结果
     * @param fileName 文件名
     */
    void exportToExcel(HttpServletResponse response, ReportQueryResult result, String fileName);
}