package com.lingyue.extract.repository;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lingyue.extract.entity.Variable;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

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

/**
 * 变量 Repository
 * 
 * @author lingyue
 * @since 2026-01-23
 */
@Mapper
public interface VariableRepository extends BaseMapper<Variable> {
    
    /**
     * 根据模板ID查询变量列表（按顺序）
     */
    @Select("SELECT * FROM variables WHERE template_id = #{templateId} ORDER BY display_order")
    List<Variable> findByTemplateId(@Param("templateId") String templateId);
    
    /**
     * 根据模板ID和变量名查询
     */
    @Select("SELECT * FROM variables WHERE template_id = #{templateId} AND name = #{name}")
    Variable findByTemplateIdAndName(@Param("templateId") String templateId, @Param("name") String name);
    
    /**
     * 根据来源文件别名查询
     */
    @Select("SELECT * FROM variables WHERE template_id = #{templateId} AND source_file_alias = #{alias} ORDER BY display_order")
    List<Variable> findByTemplateIdAndSourceFileAlias(@Param("templateId") String templateId, @Param("alias") String alias);
    
    /**
     * 根据来源类型查询
     */
    @Select("SELECT * FROM variables WHERE template_id = #{templateId} AND source_type = #{sourceType} ORDER BY display_order")
    List<Variable> findByTemplateIdAndSourceType(@Param("templateId") String templateId, @Param("sourceType") String sourceType);
    
    /**
     * 根据变量分组查询
     */
    @Select("SELECT * FROM variables WHERE template_id = #{templateId} AND variable_group = #{group} ORDER BY display_order")
    List<Variable> findByTemplateIdAndGroup(@Param("templateId") String templateId, @Param("group") String group);
    
    /**
     * 删除模板的所有变量
     */
    @Delete("DELETE FROM variables WHERE template_id = #{templateId}")
    int deleteByTemplateId(@Param("templateId") String templateId);
    
    /**
     * 统计模板变量数量
     */
    @Select("SELECT COUNT(*) FROM variables WHERE template_id = #{templateId}")
    int countByTemplateId(@Param("templateId") String templateId);
    
    /**
     * 按来源类型统计模板变量数量
     */
    @Select("SELECT source_type, COUNT(*) as count FROM variables WHERE template_id = #{templateId} GROUP BY source_type")
    List<Map<String, Object>> countByTemplateIdGroupBySourceType(@Param("templateId") String templateId);
    
    /**
     * 获取模板最大显示顺序
     */
    @Select("SELECT COALESCE(MAX(display_order), 0) FROM variables WHERE template_id = #{templateId}")
    int getMaxDisplayOrder(@Param("templateId") String templateId);
    
    /**
     * 查询引用了指定变量的变量（用于依赖分析）
     */
    @Select("""
            SELECT * FROM variables 
            WHERE template_id = #{templateId} 
            AND source_type = 'reference'
            AND source_config::text LIKE '%' || #{variableName} || '%'
            """)
    List<Variable> findVariablesReferencingVariable(@Param("templateId") String templateId, 
                                                     @Param("variableName") String variableName);
}
