package com.ruoyi.web.report.mapper;

import com.ruoyi.web.report.domain.ErpReportDefinition;
import com.ruoyi.web.report.domain.meta.ReportFieldMeta;
import com.ruoyi.web.report.domain.meta.ReportJoinMeta;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 报表定义 Mapper。
 *
 * <p>负责 {@code rpt_definition} 的基础 CRUD 与发布操作，
 * 供 Service 层统一编排业务规则。</p>
 */
public interface ErpReportDefinitionMapper {
    /**
     * 按主键查询报表定义。
     *
     * @param id 报表ID
     * @return 报表定义
     */
    ErpReportDefinition selectErpReportDefinitionById(Long id);

    /**
     * 条件查询报表定义列表。
     *
     * @param query 查询条件
     * @return 报表定义列表
     */
    List<ErpReportDefinition> selectErpReportDefinitionList(ErpReportDefinition query);

    /**
     * 按报表编码查询（用于唯一性校验）。
     *
     * @param reportCode 报表编码
     * @return 报表定义
     */
    ErpReportDefinition selectErpReportDefinitionByCode(String reportCode);

    /**
     * 新增报表定义。
     *
     * @param entity 报表实体
     * @return 受影响行数
     */
    int insertErpReportDefinition(ErpReportDefinition entity);

    /**
     * 修改报表定义。
     *
     * @param entity 报表实体
     * @return 受影响行数
     */
    int updateErpReportDefinition(ErpReportDefinition entity);

    /**
     * 按主键删除报表定义。
     *
     * @param id 报表ID
     * @return 受影响行数
     */
    int deleteErpReportDefinitionById(Long id);

    /**
     * 发布报表定义：状态改为已发布，版本号+1。
     *
     * @param id 报表ID
     * @param updateBy 操作人
     * @return 受影响行数
     */
    int publishErpReportDefinition(@Param("id") Long id, @Param("updateBy") String updateBy);

    /**
     * 查询报表字段元数据（低代码 SQL 生成使用）。
     *
     * @param reportId 报表ID
     * @return 字段元数据列表
     */
    List<ReportFieldMeta> selectFieldMetaByReportId(Long reportId);

    /**
     * 查询报表关联元数据（低代码 SQL 生成使用）。
     *
     * @param reportId 报表ID
     * @return 关联元数据列表
     */
    List<ReportJoinMeta> selectJoinMetaByReportId(Long reportId);

    /**
     * 查询审核通过的自定义 SQL。
     *
     * @param reportId 报表ID
     * @return SQL 文本；不存在返回 null
     */
    String selectApprovedCustomSqlByReportId(Long reportId);
}
