package cn.fateverse.query.mapper;

import cn.fateverse.query.entity.DynamicPage;
import cn.fateverse.query.entity.DynamicTable;
import cn.fateverse.query.entity.Table;
import cn.fateverse.query.entity.TableColumn;
import cn.fateverse.query.entity.bo.SqlSelect;
import cn.fateverse.query.entity.bo.TopologySelect;
import cn.fateverse.query.entity.query.DynamicTableQuery;
import org.apache.ibatis.annotations.Param;

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

/**
 * @author Clay
 * @date 2023-07-16
 */
public interface DynamicDataSourceMapper {

    /**
     * 检查数据库是否可连接
     *
     * @return 连接后查询的结果
     */
    Integer checkSource();

    /**
     * topology数据查询
     *
     * @param select 需要查询的数据信息
     * @return 查询结果
     */
    List<Map<String, Object>> uniSingleQueryTopology(@Param("select") TopologySelect select, @Param("page") DynamicPage page);

    /**
     * topology数据查询 获取总数
     *
     * @param select 需要查询的数据信息
     * @return 查询结果
     */
    Long uniSingleQueryTopologyCount(@Param("select") TopologySelect select);

    /**
     * 多表查询数据
     *
     * @param select 查询条件
     * @param page   分页信息
     * @return 返回数据
     */
    List<Map<String, Object>> uniMultiListQueryTopology(@Param("select") TopologySelect select, @Param("page") DynamicPage page);


    /**
     * 多表查询总数
     *
     * @param select topo查询
     * @return 总数
     */
    Long uniMultiListQueryTopologyCount(@Param("select") TopologySelect select);


    /**
     * sql自定义查询
     *
     * @param select 查询信息
     * @param page   分页信息
     * @return 返回数据
     */
    List<Map<String, Object>> uniQuerySql(@Param("select") SqlSelect select, @Param("page") DynamicPage page);

    /**
     * 自定义查询总数获取
     *
     * @param select 查询条件信息
     * @return 总数
     */
    Long uniQuerySqlCount(@Param("select") SqlSelect select);

    /**
     * 查询动态的表格源信息列表
     *
     * @param query     查询条件
     * @param page      分页对象
     * @param tableName 表名称
     * @return 查询数据
     */
    List<DynamicTable> selectTableList(@Param("table") DynamicTableQuery query, @Param("page") DynamicPage page, @Param("list") List<String> tableName, @Param("params") Map<String, Object> params);

    /**
     * 查询动态的表格源信息 总数
     *
     * @param query     查询条件
     * @param tableName 表名称
     * @return 总数
     */
    Long selectTableListCount(@Param("table") DynamicTableQuery query, @Param("list") List<String> tableName, @Param("params") Map<String, Object> params);

    /**
     * 通过表名称查询
     *
     * @param tables 表名称
     * @return 表格信息
     */
    List<Table> selectDynamicTableListByNameList(@Param("list") List<String> tables, @Param("params") Map<String, Object> params);

    /**
     * 根据tablename list 获取到所有的
     *
     * @param tables 表名称
     * @return 表格信息
     */
    List<TableColumn> selectDynamicTableColumnsByNameList(@Param("list") List<String> tables, @Param("params") Map<String, Object> params);

}
