//******************************************************************************************************
//
//文件名（FileName）：                      ItemBase.cs
//
//功能描述（Description）：                 数据项模型
//
//数据表（Tables）：                        Nothing
//
//作者（Author）：                          wudehang
//
//日期（Create Date）：                     2021-03-09
//
//CLR版本（CLR Version）：                  net Core 5.0
//
//版本（Version）：                         1.0.0
//
//公司（Company）：                         南京埃斯顿自动化股份有限公司
//
//备注：                                   数据项定义分为两种，一种为从设备上读取的源数据，另一种为需要根据源数据计算的数据，源数据只从设备中读取，不进行边缘计算。
//******************************************************************************************************
using System;
using System.Collections.Generic;

namespace Treasure.DataModel
{
    /// <summary>
    /// 数据项模型
    /// </summary>
    public class ItemBase
    {
        private string m_lastItemValue;
        private string m_ItemValue="0";

        /// <summary>
        /// 数据项唯一标识
        /// </summary>
        public string ItemID { get; set; }
        /// <summary>
        /// 数据项名称
        /// </summary>
        public string ItemName { get; set; }
        /// <summary>
        /// 数据项名称
        /// </summary>
        public string Item_MQTT_Name { get; set; }

        /// <summary>
        /// 数据项地址
        /// </summary>
        public string ItemAdress { get; set; }

        /// <summary>
        /// 数据长度
        /// </summary>
        public short ItemLength { get; set; }

        /// <summary>
        /// 数据项类型
        /// </summary>
        public DataType? ItemType { get; set; }
        /// <summary>
        /// 上传模式
        /// </summary>
        public UploadMode UploadMode { get; set; } = UploadMode.PeriodicUpload;
        /// <summary>
        /// 是否从设备中读取
        /// </summary>
        public bool IsRead { get; set; }

        /// <summary>
        /// 数据项是否断电保持
        /// </summary>
        public bool IsSave { get; set; }

        /// <summary>
        /// 上次更新数据时间
        /// </summary>
        public DateTime? LastUpDateTime { get; set; }

        /// <summary>
        /// 当前更新数据时间
        /// </summary>
        public DateTime? UpDateTime { get; set; }

        /// <summary>
        /// 上次读取数据值
        /// </summary>
        public string lastItemValue
        {
            get
            {
                return m_lastItemValue;
            }
            set
            {
                if (value == "")
                    m_lastItemValue = "0";
                else
                    m_lastItemValue = value;
            }
        }
        /// <summary>
        /// 计算后数据值
        /// </summary>
        public string ItemValue
        {
            get
            {
                if(m_ItemValue==""|| m_ItemValue == null)
                {
                    return "0";
                }
                return m_ItemValue;
            }
            set
            {
                if (value == "")
                    m_ItemValue = "0";
                else
                    m_ItemValue = value;
            }
        }
#nullable enable 
        /// <summary>
        /// 顺序计算规则组
        /// </summary>
        public List<Calculate>? calculates = new List<Calculate>();
    }
    /// <summary>
    /// 数据计算规则配置项
    /// </summary>
    public class Calculate
    {
        private string? m_ConstantValue;
        /// <summary>
        /// 计算规则索引
        /// </summary>
        public int CalculateIndex { get; set; }
        /// <summary>
        /// 计算规则配置
        /// </summary>
        public string? CalculationRule { get; set; }

        /// <summary>
        /// 本数据项是否在计算中被用到
        /// </summary>
        public bool IsCalculate { get; set; }

        /// <summary>
        /// 计算所需另一数据地址
        /// </summary>
        public string? otherItemAdress { get; set; }

        /// <summary>
        /// 计算所需的常数值
        /// </summary>
        public string? ConstantValue
        {
            get
            {
                return m_ConstantValue;
            }
            set
            {
                if (value == "")
                    m_ConstantValue = "0";
                else
                    m_ConstantValue = value;
            }
        }
#nullable enable
        /// <summary>
        /// 累计计算数据的标志值集合
        /// </summary>
        public List<string>? AccumulationValue { get; set; } = new List<string>();
        /// <summary>
        /// 数据映射集合
        /// </summary>
        public List<DataMapp>? m_dataMapp { get; set; }
    }
    /// <summary>
    /// 数据映射项
    /// </summary>
    public class DataMapp
    {
        /// <summary>
        /// 数据地址或数据值索引
        /// </summary>  
        public dynamic? Index { get; set; } = null;
        /// <summary>
        /// 数据映射信息
        /// </summary>
        public string Msg { get; set; } = "";
    }
    /// <summary>
    /// 数据项类型
    /// </summary>
    public enum DataType
    {
        /// <summary>
        /// 布尔值
        /// </summary>
        Bool,
        /// <summary>
        /// 字节型
        /// </summary>
        Byte,
        /// <summary>
        /// 短整型
        /// </summary>
        Short,
        /// <summary>
        /// 整型
        /// </summary>
        Int,
        /// <summary>
        /// 单精度浮点数
        /// </summary>
        Float,
        /// <summary>
        /// 双精度浮点数
        /// </summary>
        Double,
        /// <summary>
        /// 字符串类型
        /// </summary>
        String,
        /// <summary>
        /// 结构体类型
        /// </summary>
        Struct
    }
    /// <summary>
    /// 数据项上行模式
    /// </summary>
    public enum UploadMode
    {
        /// <summary>
        /// 周期上传
        /// </summary>
        PeriodicUpload,
        /// <summary>
        /// 变化上传
        /// </summary>
        ChangeUpload
    }
}
