package com.genersoft.iot.vmp.storager.dao;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
 * 用于存储设备信息
 */
@Mapper
@Repository
public interface DeviceMapper {
    @Select("SELECT " +
            "deviceId, " +
            "coalesce(custom_name, name) as name, " +
            "password, " +
            "manufacturer, " +
            "model, " +
            "firmware, " +
            "transport," +
            "streamMode," +
            "ip," +
            "sdpIp," +
            "localIp," +
            "port," +
            "hostAddress," +
            "expires," +
            "registerTime," +
            "keepaliveTime," +
            "createTime," +
            "updateTime," +
            "charset," +
            "subscribeCycleForCatalog," +
            "subscribeCycleForMobilePosition," +
            "mobilePositionSubmissionInterval," +
            "subscribeCycleForAlarm," +
            "ssrcCheck," +
            "asMessageChannel," +
            "geoCoordSys," +
            "treeType," +
            "online," +
            "mediaServerId," +
            "(SELECT count(0) FROM device_channel WHERE deviceId=device.deviceId) as channelCount "+
            " FROM device WHERE deviceId = #{deviceId}")
    Device getDeviceByDeviceId(String deviceId);
    @Insert("INSERT INTO device (" +
                "deviceId, " +
                "name, " +
                "manufacturer, " +
                "model, " +
                "firmware, " +
                "transport," +
                "streamMode," +
                "ip," +
                "sdpIp," +
                "localIp," +
                "port," +
                "hostAddress," +
                "expires," +
                "registerTime," +
                "keepaliveTime," +
                "keepaliveIntervalTime," +
                "createTime," +
                "updateTime," +
                "charset," +
                "subscribeCycleForCatalog," +
                "subscribeCycleForMobilePosition," +
                "mobilePositionSubmissionInterval," +
                "subscribeCycleForAlarm," +
                "ssrcCheck," +
                "asMessageChannel," +
                "geoCoordSys," +
                "treeType," +
                "online" +
            ") VALUES (" +
                "#{deviceId}," +
                "#{name}," +
                "#{manufacturer}," +
                "#{model}," +
                "#{firmware}," +
                "#{transport}," +
                "#{streamMode}," +
                "#{ip}," +
                "#{sdpIp}," +
                "#{localIp}," +
                "#{port}," +
                "#{hostAddress}," +
                "#{expires}," +
                "#{registerTime}," +
                "#{keepaliveTime}," +
                "#{keepaliveIntervalTime}," +
                "#{createTime}," +
                "#{updateTime}," +
                "#{charset}," +
                "#{subscribeCycleForCatalog}," +
                "#{subscribeCycleForMobilePosition}," +
                "#{mobilePositionSubmissionInterval}," +
                "#{subscribeCycleForAlarm}," +
                "#{ssrcCheck}," +
                "#{asMessageChannel}," +
                "#{geoCoordSys}," +
                "#{treeType}," +
                "#{online}" +
            ")")
    int add(Device device);
    @Update(value = {" "})
    int update(Device device);
    @Select(
            " "
    )
    List getDevices(Boolean online);
    @Delete("DELETE FROM device WHERE deviceId=#{deviceId}")
    int del(String deviceId);
    @Select("SELECT " +
            "deviceId, " +
            "coalesce(custom_name, name) as name, " +
            "password, " +
            "manufacturer, " +
            "model, " +
            "firmware, " +
            "transport," +
            "streamMode," +
            "ip," +
            "sdpIp," +
            "localIp," +
            "port," +
            "hostAddress," +
            "expires," +
            "registerTime," +
            "keepaliveTime," +
            "createTime," +
            "updateTime," +
            "charset," +
            "subscribeCycleForCatalog," +
            "subscribeCycleForMobilePosition," +
            "mobilePositionSubmissionInterval," +
            "subscribeCycleForAlarm," +
            "ssrcCheck," +
            "asMessageChannel," +
            "geoCoordSys," +
            "treeType," +
            "online " +
            " FROM device WHERE online = 1")
    List getOnlineDevices();
    @Select("SELECT " +
            "deviceId, " +
            "coalesce(custom_name, name) as name, " +
            "password, " +
            "manufacturer, " +
            "model, " +
            "firmware, " +
            "transport," +
            "streamMode," +
            "ip," +
            "sdpIp," +
            "localIp," +
            "port," +
            "hostAddress," +
            "expires," +
            "registerTime," +
            "keepaliveTime," +
            "createTime," +
            "updateTime," +
            "charset," +
            "subscribeCycleForCatalog," +
            "subscribeCycleForMobilePosition," +
            "mobilePositionSubmissionInterval," +
            "subscribeCycleForAlarm," +
            "ssrcCheck," +
            "asMessageChannel," +
            "geoCoordSys," +
            "treeType," +
            "online" +
            " FROM device WHERE ip = #{host} AND port=#{port}")
    Device getDeviceByHostAndPort(String host, int port);
    @Update(value = {" "})
    void updateCustom(Device device);
    @Insert("INSERT INTO device (" +
            "deviceId, " +
            "custom_name, " +
            "password, " +
            "sdpIp, " +
            "createTime," +
            "updateTime," +
            "charset," +
            "ssrcCheck," +
            "asMessageChannel," +
            "geoCoordSys," +
            "treeType," +
            "online," +
            "mediaServerId" +
            ") VALUES (" +
            "#{deviceId}," +
            "#{name}," +
            "#{password}," +
            "#{sdpIp}," +
            "#{createTime}," +
            "#{updateTime}," +
            "#{charset}," +
            "#{ssrcCheck}," +
            "#{asMessageChannel}," +
            "#{geoCoordSys}," +
            "#{treeType}," +
            "#{online}," +
            "#{mediaServerId}" +
            ")")
    void addCustomDevice(Device device);
    @Select("select count(1) as total, sum(online) as online from device")
    ResourceBaceInfo getOverview();
    @Select("select * from device")
    List getAll();
    @Select("select * from device where  asMessageChannel = 1")
    List queryDeviceWithAsMessageChannel();
}