package com.gyee.alarm.mapper.auto;


import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gyee.alarm.model.auto.AlarmTs;
import com.gyee.alarm.model.auto.ProBasicFeatureStat;
import com.gyee.alarm.model.vo.AlarmSimpleVo;
import com.gyee.alarm.model.vo.AlarmTsVo;
import com.gyee.alarm.model.vo.AlarmVo;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;


@DS("slave")
public interface AlarmTsMapper extends BaseMapper<AlarmTs> {


    @Update("CREATE STABLE if not exists ${superTableName} (ts TIMESTAMP,val INT,oval INT,confirmed BOOL) " +
            "TAGS (alarmid NCHAR(100),alarmtype NCHAR(50),characteristic NCHAR(50)," +
            "components NCHAR(50),description NCHAR(500),deviceid NCHAR(50),devicename NCHAR(70)," +
            "devicetype NCHAR(50),enabled BOOL,lineid NCHAR(50),linename NCHAR(70),modelId NCHAR(50),projectid NCHAR(50)," +
            "projectname NCHAR(70),rank INT,resettable BOOL,stationid NCHAR(50),stationname NCHAR(70),subcomponents NCHAR(50)," +
            "suffix NCHAR(50),tagid NCHAR(100),triggertype INT,uniformcode NCHAR(50));")
    int createAlarmSuperTable(@Param("superTableName") String superTableName);



    @Update("create table if not exists ${tbName} using ${superTableName} TAGS( " +
            "#{alarmid}, #{alarmtype}," +
            "#{characteristic}, #{components},#{description}, #{deviceid}, #{devicename}," +
            "#{devicetype}, #{enabled}, #{lineid}, #{linename}, #{modelId}, #{projectid}," +
            "#{projectname}, #{rank}, #{resettable}, #{stationid}, #{stationname}, #{subcomponents}," +
            "#{suffix},  #{tagid}, #{triggertype}, #{uniformcode},#{name}, #{nemCode}, #{faultCause}, #{resolvent},#{faultType},#{aname} " +
            " )")
    int createTable(@Param("tbName") String tbName, @Param("alarmid") String alarmid, @Param("alarmtype") String alarmtype,
                    @Param("characteristic") String characteristic, @Param("components") String components,
                    @Param("description") String description,
                    @Param("deviceid") String deviceid, @Param("devicename") String devicename,
                    @Param("devicetype") String devicetype, @Param("enabled") Boolean enabled,
                    @Param("lineid") String lineid, @Param("linename") String linename,
                    @Param("modelId") String modelId, @Param("projectid") String projectid,
                    @Param("projectname") String projectname, @Param("rank") Integer rank,
                    @Param("resettable") Boolean resettable, @Param("stationid") String stationid,
                    @Param("stationname") String stationname, @Param("subcomponents") String subcomponents,
                    @Param("suffix") String suffix, @Param("tagid") String tagid,
                    @Param("triggertype") Integer triggertype, @Param("uniformcode") String uniformcode, @Param("superTableName") String superTableName,
                    @Param("name") String name, @Param("nemCode") String nemCode, @Param("faultCause") String faultCause, @Param("resolvent") String resolvent, @Param("faultType") String faultType, @Param("aname") String aname

    );



    @Update("create table  if not exists ${tbName} using ${superTableName} tags( #{alarmid}, #{alarmtype}," +
            "#{characteristic}, #{components}, #{description}, #{deviceid}, #{devicename}," +
            "#{devicetype}, #{enabled}, #{lineid}, #{linename}, #{modelId}, #{projectid}," +
            "#{projectname}, #{rank}, #{resettable}, #{stationid}, #{stationname}, #{subcomponents}," +
            "#{suffix},  #{tagid}, #{triggertype}, #{uniformcode}" +
            ")")
    int createTable(AlarmVo vo);

    @Update("drop table if exists ${superTableName}")
    void dropSuperTable(@Param("superTableName")String superTableName);

    @Insert("insert into ${tbName} (ts, val,oval,confirmed) values(#{ts}, #{val}, #{oval}, #{confirmed})")
    int insertOne(AlarmTs one);



    @Insert("${sql}")
    int insertList(@Param("sql") String sql);

    @Select("select last_row(*),alarmid,alarmtype,characteristic,components,confirmed,description,deviceid,devicename,devicetype,enabled,lineid,linename," +
            "modelId,projectid,projectname,rank,resettable,stationid,stationname,subcomponents,suffix,tagid,triggertype,uniformcode from #{stbaleName} group by tbname")
    List<AlarmVo> findTags(@Param("stbaleName") String stbaleName);


    @Select("select deviceid,description,count(*) as val from #{superTableName} where ts>=#{begin} and ts<=#{end}  stationid=#{stationid}  group by description,deviceid  ")
    List<AlarmTsVo> selectByWpGroup(@Param("superTableName") String superTableName, @Param("stationid") String stationid, @Param("begin")long begin, @Param("end") long end);


    @Select("select ts,val,oval,alarmid,alarmtype,characteristic,components,confirmed,description,deviceid,devicename,devicetype,enabled,lineid,linename," +
            "modelId,projectid,projectname,rank,resettable,stationid,stationname,subcomponents,suffix,tagid,triggertype,uniformcode from #{tbName}   limit #{limit} , #{offset} ")
    List<AlarmVo> selectByTbName(@Param("tbName") String tbName,@Param("limit") long limit,@Param("offset") long offset);

    @Select("select alarmid,description,count(*) as val,max(rank),sum(timeLong) as timeLong) from #{superTableName} where ts>=#{begin} and ts<=#{end}  deviceid=#{deviceid}  group by description,alarmid  ")
    List<AlarmTsVo> selectByWtGroup(@Param("superTableName") String superTableName, @Param("deviceid") String deviceid, @Param("begin")long begin, @Param("end") long end);


//    @Select("select ts,val,alarmid,alarmtype,characteristic,components,confirmed,description,deviceid,devicename,devicetype,enabled,lineid,linename," +
//            "modelId,projectid,projectname,rank,resettable,stationid,stationname,subcomponents,suffix,tagid,triggertype,uniformcode from #{superTableName}  " +
//            "#{whereSql}  order by ts desc limit #{limit} offset #{offset} ")

//    @Select({"<script>",
//            "select  last_row(ts) as lastts,ts,val,alarmid,alarmtype,characteristic,components,confirmed,description,deviceid,devicename,devicetype,enabled,lineid,linename," +
//                    "modelId,projectid,projectname,rank,resettable,stationid,stationname,subcomponents,suffix,tagid,triggertype,uniformcode,nemCode ,faultCause,resolvent from #{superTableName} " ,
//            "<where>" ,
//
//            "<if test='modelId != null'>",
//            "and modelId= #{modelId}",
//            "</if>",
//            "<if test='description != null'>",
//            "and description like #{description}",
//            "</if>",
//            "<if test='deviceid != null'>",
//            "and deviceid = #{deviceid}",
//            "</if>",
//            "<if test='deviceType != null'>",
//            "and deviceType = #{deviceType}",
//            "</if>",
//            "<if test='components != null'>",
//            "and components = #{components}",
//            "</if>",
//            "<if test='stationid != null'>",
//            "and stationid = #{stationid}",
//            "</if>",
//            "<if test='alarmid != null'>",
//            "and alarmid = #{alarmid}",
//            "</if>",
//            "and ts &gt;= #{begin}",
//            "and ts &lt;= #{end}",
////            " and  confirmed = false ",
//            " and  enabled = true ",
//            "</where>",
//            " group by tbname,alarmid,alarmtype,characteristic,components,description,deviceid,devicename,devicetype,enabled,lineid,linename,modelId,projectid,projectname,rank,resettable,stationid,stationname,subcomponents,suffix,tagid,triggertype,uniformcode,nemCode ,faultCause,resolvent ",
//            " order by ts desc limit #{limit},#{offset} ",
//            "</script>"})

    @Select({"<script>",
            "select  ts ,val ,confirmed ,endts ,timeLong,tbname as id,alarmid as alarmId,alarmtype as alarmType,characteristic,components,confirmed,description,deviceid as deviceId,devicename,devicetype as deviceType,enabled,lineid,linename," +
                    "modelId,projectid,projectname,rank,resettable,stationid,stationname,subcomponents,suffix,tagid,triggertype,uniformcode,nemCode ,faultCause,resolvent from #{superTableName} " ,
            "<where>" ,
            " ts &gt;= #{begin}",
            "and ts &lt;= #{end}",
            "<if test='modelId != null'>",
            "and modelId= #{modelId}",
            "</if>",
            "<if test='description != null'>",
            "and characteristic like #{description}",
            "</if>",
            "<if test='deviceid != null'>",
            "and deviceid = #{deviceid}",
            "</if>",
            "<if test='deviceType != null'>",
            "and deviceType = #{deviceType}",
            "</if>",
            "<if test='alarmType != null'>",
            "and alarmType = #{alarmType}",
            "</if>",
            "<if test='components != null'>",
            "and components in (${components}) ",
            "</if>",
            "<if test='stationid != null'>",
            "and stationid = #{stationid}",
            "</if>",
            "<if test='alarmid != null'>",
            "and alarmid = #{alarmid}",
            "</if>",
            "<if test='isclose== true'>",
            "and endts is not null ",
            "</if>",
            "<if test='isclose== false'>",
            "and endts is null ",
            "</if>",

            " and  enabled = true ",
            "</where>",
            " order by ts desc limit #{limit},#{offset} ",
            "</script>"})
    List<AlarmVo> selectByWtLimit(@Param("begin")long begin,@Param("end")long end,@Param("modelId")String modelId,@Param("superTableName") String superTableName,@Param("alarmType")String alarmType,@Param("stationid")String stationid,@Param("deviceid")String deviceid,@Param("description")String description, @Param("deviceType")String deviceType, @Param("components")String components, @Param("alarmid")String alarmid, @Param("isclose")Boolean isclose,@Param("limit")int limit, @Param("offset") int offset);

    @Select({"<script>",
            "select count(*) from #{superTableName} " ,
            "<where>" ,
            " ts &gt;= #{begin}",
            "and ts &lt;= #{end}",
            "<if test='modelId != null'>",
            "and modelId= #{modelId}",
            "</if>",
            "<if test='description != null'>",
            "and characteristic like #{description}",
            "</if>",
            "<if test='deviceid != null'>",
            "and deviceid = #{deviceid}",
            "</if>",
            "<if test='deviceType != null'>",
            "and deviceType = #{deviceType}",
            "</if>",
            "<if test='components != null'>",
            "and components in (${components}) ",
            "</if>",
            "<if test='stationid != null'>",
            "and stationid = #{stationid}",
            "</if>",
            "<if test='alarmid != null'>",
            "and alarmid = #{alarmid}",
            "</if>",
            "<if test='alarmType != null'>",
            "and alarmType = #{alarmType}",
            "</if>",
            "<if test='isclose== true'>",
            "and endts is null ",
            "</if>",
            "<if test='isclose== false'>",
            "and endts is not null ",
            "</if>",
//            " and  confirmed = false ",
            " and  enabled = true ",
            "</where>",

            "</script>"})
    List<Integer> selectByWtCount(@Param("begin")long begin,@Param("end")long end,@Param("modelId")String modelId,@Param("superTableName") String superTableName,@Param("alarmType")String alarmType,@Param("stationid")String stationid,@Param("deviceid")String deviceid,@Param("description")String description, @Param("deviceType")String deviceType, @Param("components")String components,@Param("alarmid")String alarmid, @Param("isclose")Boolean isclose);
//    @Select("select deviceid as wtId,stationid as stationId,alarmid,description,components as typeCode,max(timeLong) as maxSeconds,min(timeLong) as minSeconds,avg(timeLong) as avgSeconds,sum(timeLong) as totalSeconds,count(*) as total from alarmWt where ts>=#{begin} and ts<=#{end}  and alarmtype='windturbine'  and #{begin} group by deviceid,components,stationid,alarmid,description")

    @Select({"<script>",
            "select deviceid as wtId,stationid as stationId,alarmid,description,components as typeCode,max(timeLong) as maxSeconds,min(timeLong) as minSeconds,avg(timeLong) as avgSeconds,sum(timeLong) as totalSeconds,count(*) as total from #{superTableName} " ,
            "<where>" ,

            " ts &gt;= #{begin}",
            "and ts &lt;= #{end}",
            "and stationid = #{stationid}",

            "<if test='alarmid != null'>",
            "and alarmid in (${alarmid}) ",
            "</if>",
            "<if test='components != null'>",
            "and components in (${components}) ",
            "</if>",
            "<if test='modelId != null'>",
            "and modelId = #{modelId}",
            "</if>",
            "<if test='alarmType != null'>",
            "and alarmType = #{alarmType}",
            "</if>",

            "</where>",

            " group by deviceid,components,stationid,alarmid,description ",
            " order by deviceid  ",
            "</script>"})
    List<ProBasicFeatureStat> findWtFeatureStat(@Param("superTableName") String superTableName, @Param("begin")long begin, @Param("end") long end, @Param("stationid") String stationid, @Param("modelId")String modelId,@Param("components") String components, @Param("alarmid") String alarmid, @Param("alarmType") String alarmType);


    @Select({"<script>",
            "select deviceid as wtId,stationid as stationId,alarmid,characteristic as description  ,components as typeCode,max(timeLong) as maxSeconds,min(timeLong) as minSeconds,avg(timeLong) as avgSeconds,sum(timeLong) as totalSeconds,count(*) as total from alarmCt " ,
            "<where>" ,

            " ts &gt;= #{begin}",
            "and ts &lt;= #{end}",
            "and stationid = #{stationid}",
            "<if test='modelId != null'>",
            "and modelId = #{modelId}",
            "</if>",
            "<if test='alarmid != null'>",
            "and alarmid in(${alarmid}) ",
            "</if>",
            "<if test='components != null'>",
            "and components in(${components}) ",
            "</if>",
            "<if test='deviceType != null'>",
            "and deviceType = #{deviceType}",
            "</if>",
            "</where>",

            " group by deviceid,components,stationid,alarmid,characteristic ",
            " order by deviceid  ",
            "</script>"})
    List<ProBasicFeatureStat> findCtFeatureStat( @Param("begin")long begin, @Param("end") long end, @Param("stationid") String stationid, @Param("modelId")String modelId, @Param("components") String components, @Param("alarmid") String alarmid, @Param("deviceType")String deviceType);

    @Select({"<script>",
            "select  stationid as stationId,alarmid,characteristic as description,components as typeCode,max(timeLong) as maxSeconds,min(timeLong) as minSeconds,avg(timeLong) as avgSeconds,sum(timeLong) as totalSeconds,count(*) as total from alarmCt " ,
            "<where>" ,

            " ts &gt;= #{begin}",
            "and ts &lt;= #{end}",

            "<if test='modelId != null'>",
            "and modelId = #{modelId}",
            "</if>",

            "<if test='alarmid != null'>",
            "and alarmid in(${alarmid}) ",
            "</if>",
            "<if test='components != null'>",
            "and components in(${components}) ",
            "</if>",
            "<if test='deviceType != null'>",
            "and deviceType = #{deviceType}",
            "</if>",
            "</where>",

            " group by  components,stationid,alarmid,characteristic ",
            "</script>"})
    List<ProBasicFeatureStat> findCtFeatureStatByWpId( @Param("begin")long begin, @Param("end") long end, @Param("stationid") String stationid, @Param("modelId")String modelId, @Param("components") String components, @Param("alarmid") String alarmid, @Param("deviceType")String deviceType);


       @Select({"<script>",
            "select  lineid as stationId,alarmid,characteristic as description,components as typeCode,max(timeLong) as maxSeconds,min(timeLong) as minSeconds,avg(timeLong) as avgSeconds,sum(timeLong) as totalSeconds,count(*) as total from alarmCt " ,
            "<where>" ,

            " ts &gt;= #{begin}",
            "and ts &lt;= #{end}",
            "and stationid = #{stationid}",
            "<if test='modelId != null'>",
            "and modelId = #{modelId}",
            "</if>",

            "<if test='alarmid != null'>",
            "and alarmid in(${alarmid}) ",
            "</if>",
            "<if test='components != null'>",
            "and components in(${components}) ",
            "</if>",
            "<if test='deviceType != null'>",
            "and deviceType = #{deviceType}",
            "</if>",
            "</where>",

            " group by  components,lineid,alarmid,characteristic ",

            "</script>"})
    List<ProBasicFeatureStat> findCtFeatureStatByLnId( @Param("begin")long begin, @Param("end") long end, @Param("stationid") String stationid, @Param("modelId")String modelId, @Param("components") String components, @Param("alarmid") String alarmid, @Param("deviceType")String deviceType);


    @Select({"<script>",
            "select  lineid as stationId,alarmid,characteristic as description,components as typeCode,max(timeLong) as maxSeconds,min(timeLong) as minSeconds,avg(timeLong) as avgSeconds,sum(timeLong) as totalSeconds,count(*) as total from alarmCt " ,
            "<where>" ,

            " ts &gt;= #{begin}",
            "and ts &lt;= #{end}",
            "and deviceid = #{wtId}",
            "<if test='modelId != null'>",
            "and modelId = #{modelId}",
            "</if>",

            "<if test='alarmid != null'>",
            "and alarmid in(${alarmid}) ",
            "</if>",
            "<if test='components != null'>",
            "and components in(${components}) ",
            "</if>",
            "<if test='deviceType != null'>",
            "and deviceType = #{deviceType}",
            "</if>",
            "</where>",

            " group by  components,lineid,alarmid,characteristic ",

            "</script>"})
    List<ProBasicFeatureStat> findCtFeatureStatByWtId( @Param("begin")long begin, @Param("end") long end, @Param("wtId") String wtId, @Param("modelId")String modelId, @Param("components") String components, @Param("alarmid") String alarmid, @Param("deviceType")String deviceType);

    @Select("${sql}")
    List<AlarmSimpleVo> selectLastRowByTbname( @Param("sql") String sql);
}
