package com.flowable.devops.repository;

import com.flowable.devops.entity.NodeType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 节点类型数据访问接口
 */
@Repository
public interface NodeTypeRepository extends JpaRepository<NodeType, String> {

    /**
     * 按显示顺序和ID排序获取所有节点类型
     */
    List<NodeType> findAllByOrderByDisplayOrderAscIdAsc();

    /**
     * 根据分类查询节点类型（按显示顺序排序）
     */
    List<NodeType> findByCategoryOrderByDisplayOrderAscIdAsc(NodeType.NodeCategory category);

    /**
     * 查询所有启用的节点类型（按显示顺序排序）
     */
    List<NodeType> findByEnabledTrueOrderByDisplayOrderAsc();

    /**
     * 根据分类查询启用的节点类型
     */
    List<NodeType> findByCategoryAndEnabledTrueOrderByDisplayOrderAsc(NodeType.NodeCategory category);

    /**
     * 获取指定分类下的最大显示顺序
     */
    @Query("SELECT MAX(n.displayOrder) FROM NodeType n WHERE n.category = :category")
    Integer findMaxDisplayOrderByCategory(@Param("category") NodeType.NodeCategory category);

    /**
     * 获取所有不同的分类
     */
    @Query("SELECT DISTINCT CAST(n.category AS string) FROM NodeType n ORDER BY CAST(n.category AS string)")
    List<String> findDistinctCategories();

    /**
     * 统计启用的节点类型数量
     */
    long countByEnabledTrue();

    /**
     * 按分类统计节点类型数量
     */
    @Query("SELECT CAST(n.category AS string), COUNT(n) FROM NodeType n GROUP BY n.category")
    List<Object[]> countByCategory();

    /**
     * 根据名称查询
     */
    Optional<NodeType> findByName(String name);

    /**
     * 根据实现类查询
     */
    Optional<NodeType> findByImplementationClass(String implementationClass);

    /**
     * 检查名称是否已存在
     */
    boolean existsByName(String name);

    /**
     * 检查实现类是否已存在
     */
    boolean existsByImplementationClass(String implementationClass);

    /**
     * 根据显示名称模糊查询
     */
    List<NodeType> findByNameContainingIgnoreCase(String name);

    /**
     * 统计各分类的启用节点数量
     */
    @Query("SELECT CAST(n.category AS string), COUNT(n) FROM NodeType n WHERE n.enabled = true GROUP BY n.category")
    List<Object[]> countEnabledByCategory();

    /**
     * 查询指定分类下启用的节点类型
     */
    @Query("SELECT n FROM NodeType n WHERE n.category = :category AND n.enabled = true ORDER BY n.displayOrder, n.id")
    List<NodeType> findEnabledByCategory(@Param("category") NodeType.NodeCategory category);
}
