using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Mesnac.Action.Base;
using Mesnac.Controls.Base;
using System.Windows.Forms;
using Mesnac.Codd.Session;
using Mesnac.Equips;
using Mesnac.Equips.BaseInfo;

namespace Mesnac.Action.Default.SynchroData
{
    #region 数据回放类
    /// <summary>
    /// 按倍速进行数据回放
    /// </summary>
    public class EquipReadDataSpeed : DatabaseAction, IAction
    {
        private class SelectParameters
        {
            public SelectParameters()
            {
                this.StartTime = null;
                this.EndTime = null;
                this.PlaySpeed = 1;
                this.SearchCount = 0;
            }
            public DateTime? StartTime { get; set; }
            public DateTime? EndTime { get; set; }
            private double _playspeed = 1;
            public double PlaySpeed
            {
                get
                {
                    return _playspeed;
                }
                set
                {
                    _playspeed = value;
                    if (_playspeed <= 0)
                    {
                        _playspeed = 0;
                    }
                }
            }
            public int SearchCount { get; set; }

            public object[] ToData()
            {
                object[] Result = new object[3];
                Result[0] = this.StartTime;
                Result[1] = this.EndTime;
                Result[2] = this.PlaySpeed;
                return Result;
            }
        }
        public void Run(RuntimeParameter runtime)
        {
            base.RunIni(runtime);
            SelectParameters par = new SelectParameters();
            IBaseControl StartDate = this.GetAllFormMCControlByKey("StartDate").FirstOrDefault();
            IBaseControl EndDate = this.GetAllFormMCControlByKey("EndDate").FirstOrDefault();
            IBaseControl StartTime = this.GetAllFormMCControlByKey("StartTime").FirstOrDefault();
            IBaseControl EndTime = this.GetAllFormMCControlByKey("EndTime").FirstOrDefault();
            if (StartTime != null && EndTime != null && StartDate != null && EndDate != null)
            {
                par.StartTime = Convert.ToDateTime(Convert.ToDateTime(StartDate.MCValue).ToString("yyyy-MM-dd") + " " + Convert.ToDateTime(StartTime.MCValue).ToString("HH:mm:ss"));
                par.EndTime = Convert.ToDateTime(Convert.ToDateTime(EndDate.MCValue).ToString("yyyy-MM-dd") + " " + Convert.ToDateTime(EndTime.MCValue).ToString("HH:mm:ss"));
            }
            double speed = 1;
            if (double.TryParse(runtime.Parameters, out speed))
            {
                par.PlaySpeed = speed;
                foreach (BaseEquip equip in Factory.Instance.AllEquips.Values)
                {
                    if (equip.GetType().FullName.StartsWith("Mesnac.Equip.Display"))
                    {
                        equip.Write(0, 0, par.ToData());
                    }
                }
            }
        }

    }

    #endregion

    #region 回放数据存储

    /// <summary>
    /// 设备数据存储
    /// </summary>
    public class EquipAutoSaveData : DatabaseAction, IAction
    {
        private DbHelper dbHelper = null;
        private DateTime dt_lastSave = DateTime.Now;
        private int KeyMaxIndex = 0;
        private Dictionary<string, int> KeyIndex = new Dictionary<string, int>();
        private void RefreshKeyIndex(int ideep)
        {
            #region 添加所有的信息
            if (KeyIndex.Count == 0)
            {
                foreach (BaseEquip equip in Mesnac.Equips.Factory.Instance.AllEquips.Values)
                {
                    foreach (Group group in equip.Group.Values)
                    {
                        foreach (Data data in group.Data.Values)
                        {
                            if (data.IsSave)
                            {
                                KeyIndex.Add(data.KeyName, 0);
                            }
                        }
                    }
                }
            }
            #endregion

            #region 配置数据位置
            //数据查询
            string sqlstr = "SELECT * FROM PptVariable";
            dbHelper.CommandType = CommandType.Text;
            dbHelper.CommandText = sqlstr;
            DataTable dt = dbHelper.ToDataTable();
            foreach (DataRow dr in dt.Rows)
            {
                string key = dr["VariableName"].ToString();
                int idx = Convert.ToInt32(dr["Seq"].ToString());
                if (KeyIndex.ContainsKey(key))
                {
                    KeyIndex[key] = idx;
                    if (idx > KeyMaxIndex)
                    {
                        KeyMaxIndex = idx;
                    }
                }
            }
            List<string> noTableKey = new List<string>();
            foreach (KeyValuePair<string, int> d in KeyIndex)
            {
                if (d.Value == 0)
                {
                    noTableKey.Add(d.Key);
                }
            }
            #endregion

            #region 生成数据位置
            if (ideep < 1 && noTableKey.Count > 0)
            {
                foreach (string keyName in noTableKey)
                {
                    //插入语句
                    dbHelper.ClearParameter();
                    dbHelper.CommandText = "INSERT INTO PptVariable (VariableName) VALUES (@VariableName)";
                    dbHelper.AddParameter("@VariableName", keyName);
                    if (dbHelper.DbSession.ProviderFactory.GetType().FullName.Contains("OracleClientFactory"))
                    {
                        dbHelper.CommandText = "INSERT INTO PptVariable (VariableName) VALUES (:VariableName)";
                        dbHelper.AddParameter("VariableName", keyName);
                    }
                    dbHelper.ExecuteNonQuery();
                }
                ideep++;
                RefreshKeyIndex(ideep);
            }
            #endregion

        }
        private string DataValue(Dictionary<string, object> data)
        {
            string[] dataList = new string[KeyMaxIndex + 1];
            foreach (KeyValuePair<string, object> d in data)
            {
                int idx = 0;
                if (d.Value != null && d.Value != DBNull.Value && KeyIndex.TryGetValue(d.Key, out idx))
                {
                    if (idx > 0)
                    {
                        if (d.Value is DataTable)
                        {
                            dataList[idx] = (d.Value as DataTable).TableName;
                        }
                        else
                        {
                            dataList[idx] = d.Value.ToString();
                        }
                    }
                }
            }
            string ss = ":";
            StringBuilder Result = new StringBuilder();
            for (int i = 0; i < dataList.Length; i++)
            {
                if (string.IsNullOrWhiteSpace(dataList[i]))
                {
                    Result.Append(string.Empty).Append(ss);
                }
                else
                {
                    Result.Append(dataList[i].Replace(ss, string.Empty)).Append(ss);
                }
            }
            return Result.ToString();
        }
        private class RunningData
        {
            public RunningData(string data)
            {
                this.RecordTime = DateTime.Now;
                this.Data = data;
            }
            public DateTime RecordTime { get; private set; }
            public string Data { get; private set; }
        }
        private List<RunningData> SaveRunningDataList = new List<RunningData>();
        private void ReadData(object sender, Mesnac.Equips.ReadEventArgs e)
        {
            //if (dt_lastSave.AddSeconds(1) < DateTime.Now)
            {
                dt_lastSave = DateTime.Now;
                #region 数据转存
                Dictionary<string, object> datas = new Dictionary<string, object>();
                foreach (KeyValuePair<string, object> data in e.Data)
                {
                    datas.Add(data.Key, data.Value);
                }
                string value = DataValue(datas);
                //base.LogDebug(value);
                SaveRunningDataList.Add(new RunningData(value));
                if (SaveRunningDataList.Count < 20)
                {
                    return;
                }
                #endregion
                #region 数据转存
                List<RunningData> saveData = new List<RunningData>();
                foreach (RunningData d in SaveRunningDataList)
                {
                    saveData.Add(d);
                }
                SaveRunningDataList.Clear();
                #endregion
                #region 组合执行语句
                StringBuilder sqlstr = new StringBuilder("INSERT INTO PptRunningData(RecordTime,Data) VALUES ");
                dbHelper.ClearParameter();
                for (int i = 0; i < saveData.Count; i++)
                {
                    RunningData d = saveData[i];

                    #region 过滤掉同一秒的重复记录

                    if (i > 0)
                    {
                        if (String.Format("{0:yyyyMMddHHmmss}", saveData[i - 1].RecordTime) == String.Format("{0:yyyyMMddHHmmss}", d.RecordTime))
                        {
                            continue;
                        }
                    }

                    #endregion

                    string key1 = "@RecordTime" + i.ToString();
                    string key2 = "@Data" + i.ToString();
                    if (dbHelper.DbSession.ProviderFactory.GetType().FullName.Contains("OracleClientFactory"))
                    {
                        key1 = ":RecordTime" + i.ToString();
                        key2 = ":Data" + i.ToString();
                    }
                    sqlstr.Append(" (").Append(key1).Append(",").Append(key2).Append(")");
                    if (i < saveData.Count - 1)
                    {
                        sqlstr.AppendLine(",");
                    }

                    dbHelper.AddParameter(key1, d.RecordTime);
                    dbHelper.AddParameter(key2, d.Data);
                }
                //插入语句
                dbHelper.CommandText = sqlstr.ToString();
                dbHelper.ExecuteNonQuery();
                #endregion
            }
        }
        private static bool OnlyRun = false;
        public void Run(RuntimeParameter runtime)
        {
            if (OnlyRun)
            {
                return;
            }
            OnlyRun = true;
            dbHelper = NewDbHelper(Mesnac.Basic.DataSourceFactory.MCDbType.Local);
            dbHelper.OpenConnection(false);
            RefreshKeyIndex(0);

            #region 查找读取频率最小的设备

            BaseEquip minRZEquip = null;
            foreach (BaseEquip equip in Mesnac.Equips.Factory.Instance.AllEquips.Values)
            {
                if (minRZEquip == null)
                {
                    minRZEquip = equip;
                }
                else
                {
                    if (equip.Main.ReadHz < minRZEquip.Main.ReadHz)
                    {
                        minRZEquip = equip;
                    }
                }
            }
            #endregion

            //订阅读取频率最小设备的读取事件
            if (minRZEquip != null)
            {
                minRZEquip.EquipReadData += ReadData;
            }
        }
    }

    #endregion
}