using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.SQLite;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
//using System.Windows.Controls;
using FLY.HeatingHelper;
using MathNet.Numerics.LinearAlgebra;

namespace FLY.HeatingHelper
{
    /// <summary>
    /// 数据,单例模式
    /// </summary>
    public class ThickHeatData4SQLite_V1 : ThickHeatData
    {
        class Temp
        {
            public string A { get; set; }
            public string B { get; set; }
            public string C { get; set; }
        }

        #region 单例模式
        private static ThickHeatData4SQLite_V1 _instance = new ThickHeatData4SQLite_V1();
        static ThickHeatData4SQLite_V1()
        {

        }
        private ThickHeatData4SQLite_V1() : base() 
        {
            DBName = null;
        }

        public static ThickHeatData4SQLite_V1 Instance
        {
            get
            {
                return _instance;
            }
        }
        #endregion

        #region 数据库接口
        /// <summary>
        /// 从数据库中获取数据,清除以前数据
        /// </summary>
        public override void GetDataFromDB(bool reload = false)
        {
            Model.Model_HeatData db;

            string connectionString = ConfigurationManager.ConnectionStrings[DBName].ConnectionString.ToString();
            using (db = new Model.Model_HeatData(DBName))
            {
                var result = db.Database.SqlQuery<Temp>("SELECT min(\"结束时间\")as A,MAX(\"结束时间\") as B from HeatData").First();
                TotalDataFrom = DateTime.Parse(result.A);
                TotalDataTo = DateTime.Parse(result.B);
                LoadDataTo = new DateTime(TotalDataTo.Ticks);
                LoadDataSpan = new TimeSpan(2, 0, 0, 0);
                //DataFrom = DBTo - new TimeSpan(2, 0, 0, 0);
            }
            string cmdstr;
            if (reload || _dat_times.Count() <= 0)
            {
                cmdstr = string.Format("select * from [HeatData2] where 结束时间>=\"{0}\" and 结束时间<=\"{1}\"",
                                                                                (LoadDataTo - LoadDataSpan).ToString("yyyy-MM-dd HH:mm:ss"),
                                                                                LoadDataTo.ToString("yyyy-MM-dd HH:mm:ss"));
            }
            else
            {
                cmdstr = string.Format("select * from [HeatData2] where 结束时间>=\"{0}\" and 结束时间<=\"{1}\"",
                                                                                (_dat_times.Last()).ToString("yyyy-MM-dd HH:mm:ss"),
                                                                                LoadDataTo.ToString("yyyy-MM-dd HH:mm:ss"));
            }
            SQLiteDataAdapter dbDataAdapter = new SQLiteDataAdapter(cmdstr, connectionString);
            SQLiteCommandBuilder cb = new SQLiteCommandBuilder(dbDataAdapter);

            dataTable.Clear();
            dbDataAdapter.Fill(dataTable);
            //FetchData();
            //ResetCluster();
        }

        /// <summary>
        /// 从dataTable中提取数据到内部缓冲区
        /// </summary>
        protected override int FetchData()
        {
            _dat_times.Clear();
            _thicks.Clear();
            _thick_means.Clear();
            _thick_2sigmas.Clear();
            _heats.Clear();
            int cnt = 0;
            int i = 1;
            foreach (DataRow dr in dataTable.Rows)
            {
                _dat_times.Add(dr.Field<DateTime>("结束时间"));
                _thick_means.Add(dr.Field<double>("厚度均值"));
                _thick_2sigmas.Add(dr.Field<double>("SIGMA2"));
                List<double> th = new List<double>();
                i = 1;
                while (true)
                {
                    string fieldName = "厚度" + i++;
                    double tmp;
                    try
                    {
                        tmp = dr.Field<double>(fieldName);
                    }
                    catch
                    {
                        break;
                    }
                    th.Add(tmp);
                }
                _thicks.Add(th.ToArray());
                i = 1;
                List<double> heat = new List<double>();
                while (true)
                {
                    string fieldName = "加热" + i++;
                    int tmp;
                    try
                    {
                        tmp = dr.Field<int>(fieldName);
                    }
                    catch
                    {
                        break;
                    }
                    heat.Add(tmp);
                }
                _heats.Add(heat.ToArray());
                _resetBolts.Add(dr.Field<int>("复位区号"));
                _rotAngles.Add(dr.Field<double>("旋转角度°"));
                cnt++;
            }
            DataChanged++;
            return cnt;
        }

        /// <summary>
        /// 从dataTable中提取新数据到内部缓冲区
        /// </summary>
        protected override int FetchNewData()
        {
            DateTime lasttime = _dat_times.Last();
            int cnt = 0;
            int i = 1;
            foreach (DataRow dr in dataTable.Rows)
            {
                DateTime dtmp = dr.Field<DateTime>("结束时间");
                if (lasttime >= dtmp) continue;
                _dat_times.Add(dtmp);
                _thick_means.Add(dr.Field<double>("厚度均值"));
                _thick_2sigmas.Add(dr.Field<double>("SIGMA2"));
                List<double> th = new List<double>();
                i = 1;
                while (true)
                {
                    string fieldName = "厚度" + i++;
                    double tmp;
                    try
                    {
                        tmp = dr.Field<double>(fieldName);
                    }
                    catch
                    {
                        break;
                    }
                    th.Add(tmp);
                }
                _thicks.Add(th.ToArray());
                i = 1;
                List<double> heat = new List<double>();
                while (true)
                {
                    string fieldName = "加热" + i++;
                    int tmp;
                    try
                    {
                        tmp = dr.Field<int>(fieldName);
                    }
                    catch
                    {
                        break;
                    }
                    heat.Add(tmp);
                }
                _heats.Add(heat.ToArray());
                cnt++;
            }
            DataChanged++;
            return cnt;
        }

        public override int LoadMetaDataFromDB()
        {
            throw new NotImplementedException();
        }

        public override int LoadDataFromDB(int reload)
        {
            throw new NotImplementedException();
        }

        private DataTable dataTable = new DataTable();
        #endregion
    }
}