using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Domain.IoTDUIEntity
{
    public class Header
    {
        /// <summary>
        /// 消息的唯一标识符，长度小于128个字符。messageId仅用于标识消息，无其他使用。建议使用随机生成的UUID作为messageId。
        /// </summary>
        public string messageId { get; set; }
        /// <summary>
        /// 指令的类别。 目前支持的类别有：DuerOS.ConnectedHome.Discovery：发现设备指令。DuerOS.ConnectedHome.Control：控制设备指令。DuerOS.ConnectedHome.Query：查询设备指令。
        /// </summary>
        public string @namespace { get; set; }
        /// <summary>
        /// 指令的名称。
        /// </summary>
        public string name { get; set; }
        /// <summary>
        /// payload的版本号。
        /// </summary>
        public string payloadVersion { get; set; }
    }
    public class Brightness
    {
        /// <summary>
        /// 灯光亮度的百分比值，是double类型，取值范围为0～100。其中0表示灯在打开时的最小亮度，100表示灯的最大亮度。	
        /// </summary>
        public string value { get; set; }
    }
    public class DeltaBrightness
    {
        public string value { get; set; }
    }
    public class Temperature
    {
        /// <summary>
        /// 温度设定之前设备的温度，是double类型。
        /// </summary>
        public string value { get; set; }
    }
    public class DeltaTemperature
    {
        public string value { get; set; }
    }
    public class Volume
    {
        public string value { get; set; }
    }
    public class DeltaVolume
    {
        public string value { get; set; }
    }
    public class Channel
    {
        public string value { get; set; }
    }
    public class ChannelName
    {
        public string value { get; set; }
    }
    public class DeltaChannel
    {
        public string value { get; set; }
    }
    /// <summary>
    /// 设备的风速对象，包含一个属性值value或者一个属性值level，取决于用户自然表达。
    /// </summary>
    public class SpeedLevel
    {
        /// <summary>
        /// 设备的风速值，是int类型，取值范围是1～10。用户表达具体风速值时，会出该字段。
        /// </summary>
        public string value { get; set; }
    }
    public class DeltaSpeedLevel
    {
        public string value { get; set; }
    }
    /// <summary>
    /// 湿度
    /// </summary>
    public class Humidity
    {
        public string value { get; set; }
    }
    public class DeltaHumidity
    {
        public string value { get; set; }
    }
    public class Mode
    {
        /// <summary>
        /// 设备类型
        /// </summary>
        public string deviceType { get; set; }
        /// <summary>
        /// 设备模式，与设备类型相关，不同设备类型的模式不同
        /// </summary>
        public string value { get; set; }
    }
    /// <summary>
    /// 调整风向
    /// </summary>
    public class DeltaAngel
    {
        public string value { get; set; }
    }
    public class Color
    {
        public string value { get; set; }
    }
    /// <summary>
    /// 定时操作对应的触发时间，为时间戳，精确到秒。
    /// </summary>
    public class Timestamp
    {
        public int value { get; set; }
    }

    public class Request
    {
        public class Appliance
        {
            /// <summary>
            /// 设备标识符。标识符在用户拥有的所有设备上必须是唯一的。此外，标识符需要在同一设备的多个发现请求之间保持一致。标识符可以包含任何字母或数字和以下特殊字符：_ - = # ; : ? @ &。标识符不能超过256个字符。
            /// </summary>
            public string applianceId { get; set; }
            /// <summary>
            /// 提供给设备云使用，存放设备或场景相关的附加信息，是键值对。DuerOS不解析或使用这些数据。该属性的内容不能超过5000字节。
            /// </summary>
            public Dictionary<string, string> additionalApplianceDetails { get; set; }
        }
        public class Payload
        {
            /// <summary>
            /// 设备云端获取的access token。
            /// </summary>
            public string accessToken { get; set; }
            /// <summary>
            /// /仅当使用家庭组功能会出现此字段，表示仅期望获取对应家庭组下的设备列表，IOT厂商仅返回对应group下的设备即可
            /// </summary>
            public string group { get; set; }
            /// <summary>
            /// 设备
            /// </summary>
            public Appliance appliance { get; set; }
            /// <summary>
            /// 定时控制
            /// </summary>
            public Timestamp timestamp { get; set; }

            public Brightness brightness { get; set; }
            public DeltaBrightness deltaBrightness { get; set; }

            public Temperature temperature { get; set; }
            public DeltaTemperature deltaTemperature { get; set; }

            public Volume volumn { get; set; }
            public DeltaVolume deltaVolumn { get; set; }

            public Channel channel { get; set; }
            public ChannelName channelName { get; set; }
            public DeltaChannel deltaChannel { get; set; }

            public SpeedLevel speedLevel { get; set; }
            public DeltaSpeedLevel deltaSpeedLevel { get; set; }

            public Humidity humidity { get; set; }
            public DeltaHumidity deltaHumidity { get; set; }

            public Mode mode { get; set; }
            public int duration { get; set; }

            public DeltaAngel deltaAngel { get; set; }

            public Color color { get; set; }
        }

        public class AppliancesRequest
        {
            public Header header { get; set; }
            public Payload payload { get; set; }
        }
    }

    public class DiscoverResponse
    {
        /// <summary>
        /// 设备的属性信息。当设备没有属性信息时，协议中不需要传入该字段。每个设备允许同步的最大的属性数量是10。
        /// </summary>
        public class Attributes
        {
            /// <summary>
            /// 属性名称，支持数字、字母和下划线，长度不能超过128个字符。
            /// </summary>
            public string name { get; set; }
            /// <summary>
            /// 属性值，支持多种json类型。
            /// </summary>
            public string value { get; set; }
            /// <summary>
            /// 属性值的单位名称，支持数字、字母和下划线，长度不能超过128个字符。
            /// </summary>
            public string scale { get; set; }
            /// <summary>
            /// 属性值取样的时间戳，单位是秒。
            /// </summary>
            public string timestampOfSample { get; set; }
            /// <summary>
            /// 属性值取样的时间误差，单位是ms。如果设备使用的是轮询时间间隔的取样方式，那么uncertaintyInMilliseconds就等于时间间隔。如温度传感器每1秒取样1次，那么uncertaintyInMilliseconds的值就是1000。
            /// </summary>
            public string uncertaintyInMilliseconds { get; set; }
        }
        /// <summary>
        /// discoveredGroups 对象的数组，该对象包含可发现分组，与用户设备帐户相关联的。 如果没有与用户帐户关联的分组，此属性应包含一个空数组。 如果发生错误，该属性可以为空数组[]。阵列中允许的最大项目数量为10。
        /// </summary>
        public class DiscoveredGroups
        {
            /// <summary>
            /// 用户用来识别分组的名称, 不应包含特殊字符或标点符号，长度不超过20字符。
            /// </summary>
            public string groupName { get; set; }
            /// <summary>
            /// 分组所包含设备ID的数组，要求设备ID必须是已经发现的设备中的ID，否则会同步失败，每个分组设备ID数量不超过50。
            /// </summary>
            public List<string> applianceIds { get; set; }
            /// <summary>
            /// 分组备注信息，不能超过128个字符。
            /// </summary>
            public string groupNotes { get; set; }
            /// <summary>
            /// 提供给技能使用的分组相关的附加信息的键值对。该属性的内容不能超过2000字符。而且DuerOS也不了解或使用这些数据。
            /// </summary>
            public Dictionary<string, string> additionalGroupDetails { get; set; }
        }

        public class DiscoveredAppliances
        {
            /// <summary>
            /// 设备标识符。标识符在用户拥有的所有设备上必须是唯一的。此外，标识符需要在同一设备的多个发现请求之间保持一致。标识符可以包含任何字母或数字和以下特殊字符：_ - = # ; : ? @ &。标识符不能超过256个字符。
            /// </summary>
            public string applianceId { get; set; }
            /// <summary>
            /// 设备属于的分组或家庭组。
            ///家庭组是为当一个用户账号拥有或管理了多个家庭或酒店多个房间的设备，期望控制时对这些家庭或房间做隔离的场景而设计的。
            ///使用家庭组时，思必驰服务将仅从对应组下面筛选目标设备，用户语音指令中无需特别指明设备位置即可轻松控制，实现与无分组场景无差别的用户体验，适合酒店、学校、图书馆等场景使用
            /// </summary>
            public string group { get; set; }
            /// <summary>
            /// 设备类型，设备商只能传规定值。
            /// </summary>
            public string applianceType { get; set; }
            /// <summary>
            /// 用户用来识别设备的名称。 是字符串类型，不能包含特殊字符和标点符号，长度不能超过128个字符。
            /// </summary>
            public string friendlyName { get; set; }
            /// <summary>
            /// 别名
            /// </summary>
            public List<string> aliasNames { get; set; }
            /// <summary>
            /// 别名
            /// </summary>
            public List<string> nicknames { get; set; }
            /// <summary>
            /// 设备厂商
            /// </summary>
            public string manufacturerName { get; set; }
            /// <summary>
            /// 设备型号
            /// </summary>
            public string modelName { get; set; }
            /// <summary>
            /// 设备的位置
            /// </summary>
            public string zone { get; set; }
            /// <summary>
            /// 设备支持的操作类型数组。
            /// </summary>
            public List<string> actions { get; set; }
            /// <summary>
            /// 设备的描述信息
            /// </summary>
            public string description { get; set; }
            /// <summary>
            /// 提供给设备云使用，存放设备或场景相关的附加信息，是键值对。DuerOS不解析或使用这些数据。该属性的内容不能超过5000字节。
            /// </summary>
            public Dictionary<string, string> additionalApplianceDetails { get; set; }
            /// <summary>
            /// 定时操作对应的触发时间，为时间戳，精确到秒。仅在namespace:DUI.SmartHome.Control且name:TimingXXX的指令中出现
            /// </summary>
            public int timestamp { get; set; }
            /// <summary>
            /// 操作的持续时间。单位:秒。仅在namespace:DUI.SmartHome.Control的指令中存在
            /// </summary>
            public int duration { get; set; }
            /// <summary>
            /// 定时操作对应的完成时间，为时间戳，精确到秒。仅在namespace:DUI.SmartHome.Control且name:TimingXXX的指令中出现
            /// </summary>
            public int endtime { get; set; }
            /// <summary>
            /// 指定受控的区域/隔间，非必传参数，仅在DUI.SmartHome.Control指令中存在。
            ///设备类型对应的合法值如下：
            ///FRIDGE: REFRIGERATOR(冷藏室), FREEZER(冷冻室), SMARTCONVERTIBLE(变温区)
            ///GAS_STOVE: LEFT_STOVE(左灶具), RIGHT_STOVE(右灶具)
            ///INDUCTION_COOKER: LEFT_STOVE(左灶具), RIGHT_STOVE(右灶具)
            /// </summary>
            public string compartment { get; set; }
        }
        public class Payload
        {
            /// <summary>
            /// 云端获取的accessToken
            /// </summary>
            public string accessToken { get; set; }
            /// <summary>
            /// 以对象数组返回客户关联设备云帐户的设备、场景。如客户关联帐户没有设备、场景则返回空数组。如果在发现过程中出现错误，字段值设置为null, 用户允许接入的最大的设备数量是300。
            /// </summary>
            public List<DiscoveredAppliances> appliances { get; set; }
        }
        public class AppliancesResponse
        {
            /// <summary>
            /// Header
            /// </summary>
            public Header header { get; set; }
            /// <summary>
            /// 设备信息
            /// </summary>
            public Payload payload { get; set; }
        }
    }

    public class ControlRequest
    {
        public class Appliance
        {
            /// <summary>
            /// 设备标识符。标识符在用户拥有的所有设备上必须是唯一的。此外，标识符需要在同一设备的多个发现请求之间保持一致。标识符可以包含任何字母或数字和以下特殊字符：_ - = # ; : ? @ &。标识符不能超过256个字符。
            /// </summary>
            public string applianceId { get; set; }
            /// <summary>
            /// 提供给设备云使用，存放设备或场景相关的附加信息，是键值对。DuerOS不解析或使用这些数据。该属性的内容不能超过5000字节。
            /// </summary>            
            public Dictionary<string, string> additionalApplianceDetails { get; set; }
        }
    }

    public class ControlResponse
    {
        public class Payload
        {
        }
        public class ControlAppResponse
        {
            /// <summary>
            /// Header
            /// </summary>
            public Header header { get; set; }
            /// <summary>
            /// Payload
            /// </summary>
            public Payload payload { get; set; }
        }
    }

    public class Error
    {
        public class Payload
        {
            public string errorCode { get; set; }
            public string message { get; set; }
        }
        public class ErrorResponse
        {
            /// <summary>
            /// Header
            /// </summary>
            public Header header { get; set; }
            /// <summary>
            /// Payload
            /// </summary>
            public Payload payload { get; set; }
        }
    }
}

