package com.hw.tdengine.mapper;

import com.hw.tdengine.api.domain.*;
import com.hw.tdengine.api.domain.ems.TdSuperTableEmsSelectVo;
import org.apache.ibatis.annotations.Param;

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

/**
 * @ClassDescription:TDengine数据库交互接口
 * @ClassName: TdEngineMapper
 * @Author: thinglinks
 * @Date: 2021-12-27 14:52:34
 * @Version 1.0
 */
public interface TdEngineMapper {

    /**
     * @param databaseName
     * @description 创建数据库
     * @author xins
     * @date 2023-08-28 13:16
     */
    void createDatabase(String databaseName);

    /**
     * @param databaseName
     * @param superTableName
     * @param firstFieldName
     * @param schemaFields
     * @param tagsFields
     * @description 创建超级表
     * @author xins
     * @date 2023-08-28 11:09
     */
    void createSuperTable(@Param("databaseName") String databaseName,
                          @Param("superTableName") String superTableName,
                          @Param("firstFieldName") String firstFieldName,
                          @Param("schemaFields") List<TdFieldVo> schemaFields,
                          @Param("tagsFields") List<TdFieldVo> tagsFields
    );

    /**
     * @param: databaseName
     * @param: superTableName
     * @param: tableName
     * @param: tagsFieldValues
     * @description 创建子表
     * @author xins
     * @date 2023-08-28 15:58
     */
    void createTable(@Param("databaseName") String databaseName,
                     @Param("superTableName") String superTableName,
                     @Param("tableName") String tableName,
                     @Param("tagsFieldValues") List<TdField> tagsFieldValues);


    /**
     * @param: databaseName
     * @param: superTableName
     * @param: addFieldsVo
     * @description 增加超级表的列
     * @author xins
     * @date 2023-08-28 17:11
     */
    void addSuperTableColumn(@Param("databaseName") String databaseName,
                             @Param("superTableName") String superTableName,
                             @Param("addFieldsVo") TdFieldVo addFieldsVo);

    /**
     * @param: databaseName
     * @param: superTableName
     * @param: modifyFieldsVo
     * @description 修改超级表列宽（只适用于nchar类型）
     * @author xins
     * @date 2023-10-11 9:01

     */
    void modifySuperTableColumn(@Param("databaseName") String databaseName,
                                @Param("superTableName") String superTableName,
                                @Param("modifyFieldsVo") TdFieldVo modifyFieldsVo);

    /**
     * @param: databaseName
     * @param: superTableName
     * @param: dropFieldsVo
     * @description 删除超级表的列
     * @author xins
     * @date 2023-08-28 17:11
     */
    void dropSuperTableColumn(@Param("databaseName") String databaseName,
                              @Param("superTableName") String superTableName,
                              @Param("dropField") TdField dropField);


    /**
     * @param: databaseName
     * @param: tableName
     * @param: tagName
     * @param: tagValue
     * @description 修改子表的tagValue
     * @author xins
     * @date 2023-08-30 11:02
     */
    void alterTableTag(@Param("databaseName") String databaseName,
                       @Param("tableName") String tableName,
                       @Param("tagName") String tagName,
                       @Param("tagValue") Object tagValue
    );


    /**
     * @param: databaseName
     * @param: tableName
     * @param: schemaFields
     * @description 插入数据
     * @author xins
     * @date 2023-08-29 10:03
     */
    void insertTable(@Param("databaseName") String databaseName,
                     @Param("tableName") String tableName,
                     @Param("schemaFields") List<TdField> schemaFields);


    /**
     * @return List<Map < Object>>
     * @param: tdSelectDto
     * @description 查询具体某个子表最新数据，适用于设备监测页面，先根据监控单元获取设备信息，再根据设备来获取最新的数据
     * @author xins
     * @date 2023-08-29 10:43
     */
    List<Map<String, Object>> getLatestData(TdSelectDto tdSelectDto);

    /**
     * @return List<Map < Object>>
     * @param: tdSelectDto
     * @description 根据tagsname获取超级表最新信息，适用于设备汇总页面，先分页获取设备信息，再获取所有此物模型下的最新信息（冗余，但每页只获取一次，不需要每个设备都获取一次
     * 如果需要根据时间周期获取最新的数据，则需要用select last_row()
     * @author xins
     * @date 2023-08-29 14:42
     */
    List<Map<String, Object>> getLatestDataByTags(TdSuperTableSelectVo tdSuperTableSelectVo);


    /**
     * @return List<Map <String,Object>>
     * @param: tdSelectDto
     * @description 获取历史数据
     * @author xins
     * @date 2023-08-29 15:50
     */
    List<Map<String, Object>> getHistoryData(TdHistorySelectDto tdHistorySelectDto);

    int getCountOfHistoryData(TdHistorySelectDto tdHistorySelectDto);


    /**
     * @return List<Map <String,Object>>
     * @param: tdSelectDto
     * @description 获取历史数据
     * @author xins
     * @date 2023-08-29 15:50
     */
    List<Map<String, Object>> getSuperTableHistoryData(TdSuperTableEmsSelectVo tdSuperTableEmsSelectVo);

    int getCountOfSuperTableHistoryData(TdSuperTableEmsSelectVo tdSuperTableEmsSelectVo);


//    /**
//     * 检查表是否存在
//     * @param dataBaseName
//     * @param tableName 可以为超级表名或普通表名
//     * @return
//     */
//    Integer checkTableExists(@Param("dataBaseName") String dataBaseName, @Param("tableName")String tableName);


//
//    List<Map<String, Object>> getRealtimeData(SelectVisualDto selectVisualDto);
//
//    List<Map<String, Object>> getAggregateData(SelectVisualDto selectVisualDto);


    //    void addTagForSuperTable(@Param("superTableName") String superTableName,
//                                @Param("fieldsVo") FieldsVo fieldsVo);
//
//    void dropTagForSuperTable(@Param("superTableName") String superTableName,
//                                 @Param("fieldsVo") FieldsVo fieldsVo);

}
