using FLY.OBJComponents.Server.Model;

using SQLite;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;

namespace FLY.Blowing.DbViewer.Core
{
    public class DbHelper : INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged;

        public string DbDirPath { get; set; } = @"D:\blowingdata";
        
        public string DbPathAirRing => System.IO.Path.Combine(DbDirPath, "airring.sqlite3");
        public string DbPathWeight => System.IO.Path.Combine(DbDirPath, "weight.sqlite3");
        public string DbPathWinder => System.IO.Path.Combine(DbDirPath, "winder.sqlite3");
        public string DbPathIbc => System.IO.Path.Combine(DbDirPath, "ibc.sqlite3");

        public bool IsAirRingExist { get; private set; }
        public bool IsWeightExist { get; private set; }
        public bool IsWinderExist { get; private set; }
        public bool IsIbcExist { get; private set; }

        public DateTime AirRingDbBeginTime { get; private set; }
        public DateTime AirRingDbEndTime { get; private set; }

        public DateTime WeightDbBeginTime { get; private set; }
        public DateTime WeightDbEndTime { get; private set; }

        public DateTime WinderDbBeginTime { get; private set; }
        public DateTime WinderDbEndTime { get; private set; }

        public DateTime IbcDbBeginTime { get; private set; }
        public DateTime IbcDbEndTime { get; private set; }




        FLY.FeedbackRenZiJia.Server.Model.DbModel dbModelAirRing = null;
        FLY.Weight.Server.Model.DbModel dbModelWeight = null;
        FLY.Winder.Server.Model.DbModel dbModelWinder = null;
        FLY.IBC.Server.Model.DbModel dbModelIbc = null;


        public DbHelper()
        {

        }

        /// <summary>
        /// 出错代码
        /// </summary>
        public string ErrorMsg { get; private set; }

        public bool IsDbErr { get; private set; }
        /// <summary>
        /// 从表获取数据
        /// </summary>
        public bool Init()
        {
            IsAirRingExist = System.IO.File.Exists(DbPathAirRing);
            IsWeightExist = System.IO.File.Exists(DbPathWeight);
            IsWinderExist = System.IO.File.Exists(DbPathWinder);
            IsIbcExist = System.IO.File.Exists(DbPathIbc);


            if (IsAirRingExist)
            {
                if (!Init_airRing())
                {
                    return false;
                }
            }

            if (IsWeightExist)
            {
                if (!Init_weight())
                {
                    return false;
                }
            }

            if (IsWinderExist)
            {
                if (!Init_winder())
                {
                    return false;
                }
            }

            if (IsIbcExist)
            {
                if (!Init_ibc())
                {
                    return false;
                }
            }

            ErrorMsg = "数据库 加载成功";
            IsDbErr = false;
            return true;
        }

        bool Init_airRing()
        {
            try
            {
                dbModelAirRing = new FeedbackRenZiJia.Server.Model.DbModel(DbPathAirRing);
                if (!dbModelAirRing.InitNoBuild())
                {
                    ErrorMsg = $"{DbPathAirRing} 数据库格式异常";
                    IsDbErr = true;
                    return false;
                }
                string cmd = $"SELECT Time FROM {dbModelAirRing.TbThickHeat.TableName} ORDER BY ID LIMIT 1";
                var ret = dbModelAirRing.sqliteHelper.ExecuteScalar(cmd);
                AirRingDbBeginTime = System.Convert.ToDateTime(ret);

                cmd = $"SELECT Time FROM {dbModelAirRing.TbThickHeat.TableName} ORDER BY ID DESC LIMIT 1";
                ret = dbModelAirRing.sqliteHelper.ExecuteScalar(cmd);
                AirRingDbEndTime = System.Convert.ToDateTime(ret);
            }
            catch (Exception e)
            {
                ErrorMsg = e.Message;
                IsDbErr = true;
                return false;
            }
            return true;
        }
        bool Init_weight() 
        {
            try
            {
                dbModelWeight = new Weight.Server.Model.DbModel(DbPathWeight);
                if (!dbModelWeight.InitNoBuild())
                {
                    ErrorMsg = $"{DbPathWeight} 数据库格式异常";
                    IsDbErr = true;
                    return false;
                }

                string cmd = $"SELECT Time FROM {dbModelWeight.TbFlow.TableName} ORDER BY ID LIMIT 1";
                var ret = dbModelWeight.sqliteHelper.ExecuteScalar(cmd);
                WeightDbBeginTime = System.Convert.ToDateTime(ret);

                cmd = $"SELECT Time FROM {dbModelWeight.TbFlow.TableName} ORDER BY ID DESC LIMIT 1";
                ret = dbModelWeight.sqliteHelper.ExecuteScalar(cmd);
                WeightDbEndTime = System.Convert.ToDateTime(ret);
            }
            catch (Exception e)
            {
                ErrorMsg = e.Message;
                IsDbErr = true;
                return false;
            }
            return true;
        }
        bool Init_winder() 
        {
            try
            {
                dbModelWinder = new FLY.Winder.Server.Model.DbModel(DbPathWinder);
                if (!dbModelWinder.InitNoBuild())
                {
                    ErrorMsg = $"{DbPathWinder} 数据库格式异常";
                    IsDbErr = true;
                    return false;
                }

                string cmd = $"SELECT Time FROM {dbModelWinder.TbWinderInfo.TableName} ORDER BY ID LIMIT 1";
                var ret = dbModelWinder.sqliteHelper.ExecuteScalar(cmd);
                WinderDbBeginTime = System.Convert.ToDateTime(ret);

                cmd = $"SELECT Time FROM {dbModelWinder.TbWinderInfo.TableName} ORDER BY ID DESC LIMIT 1";
                ret = dbModelWinder.sqliteHelper.ExecuteScalar(cmd);
                WinderDbEndTime = System.Convert.ToDateTime(ret);
            }
            catch (Exception e)
            {
                ErrorMsg = e.Message;
                IsDbErr = true;
                return false;
            }
            return true;
        }
        bool Init_ibc()
        {
            try
            {
                dbModelIbc = new FLY.IBC.Server.Model.DbModel(DbPathIbc);
                if (!dbModelIbc.InitNoBuild())
                {
                    ErrorMsg = $"{DbPathIbc} 数据库格式异常";
                    IsDbErr = true;
                    return false;
                }

                string cmd = $"SELECT Time FROM {dbModelIbc.TbWidth.TableName} ORDER BY ID LIMIT 1";
                var ret = dbModelIbc.sqliteHelper.ExecuteScalar(cmd);
                IbcDbBeginTime = System.Convert.ToDateTime(ret);

                cmd = $"SELECT Time FROM {dbModelIbc.TbWidth.TableName} ORDER BY ID DESC LIMIT 1";
                ret = dbModelIbc.sqliteHelper.ExecuteScalar(cmd);
                IbcDbEndTime = System.Convert.ToDateTime(ret);
            }
            catch (Exception e)
            {
                ErrorMsg = e.Message;
                IsDbErr = true;
                return false;
            }
            return true;
        }

        public string GetPackMsg { get; private set; }
        
        public DbProfilePack GetPack(DateTime startTime, DateTime endTime)
        {
            DbProfilePack profilePack = new DbProfilePack();
            
            profilePack = GetProfilePack_AirRing(startTime, endTime, profilePack);

            profilePack = GetProfilePack_Ibc(startTime, endTime, profilePack);

            profilePack = GetProfilePack_Winder(startTime, endTime, profilePack);

            profilePack = GetProfilePack_Weight(startTime, endTime, profilePack);
            return profilePack;
        }
        DbProfilePack GetProfilePack_AirRing(DateTime startTime, DateTime endTime, DbProfilePack profilePack)
        {
            if (dbModelAirRing == null)
                return profilePack;
            GetPackMsg = "从风环数据库加载数据";

            string startTime_str = startTime.ToStringOfSQLiteFieldType();
            string endTime_str = endTime.ToStringOfSQLiteFieldType();

            string condition =
                $"WHERE Time>={startTime_str}" +
                $" AND Time<={endTime_str}";

            var db_thickHeats = dbModelAirRing.TbThickHeat.Find(condition);
            var lc_thickHeats = FLY.FeedbackRenZiJia.Server.Model.Lc_AutoMapperProfile.Mapper.Map<
                List<FLY.FeedbackRenZiJia.Server.Model.Db_ThickHeat>, List<FLY.FeedbackRenZiJia.Server.Model.Lc_ThickHeat>>(db_thickHeats);
            profilePack.ThickHeats = lc_thickHeats;

            return profilePack;
        }
        DbProfilePack GetProfilePack_Ibc(DateTime startTime, DateTime endTime, DbProfilePack profilePack) 
        {
            if (dbModelIbc == null)
                return profilePack;
            GetPackMsg = "从IBC数据库加载数据";

            string startTime_str = startTime.ToStringOfSQLiteFieldType();
            string endTime_str = endTime.ToStringOfSQLiteFieldType();

            string condition =
                $"WHERE Time>={startTime_str}" +
                $" AND Time<={endTime_str}";

            var db_widths = dbModelIbc.TbWidth.Find(condition);
            profilePack.Widths = db_widths;

            return profilePack;
        }
        DbProfilePack GetProfilePack_Winder(DateTime startTime, DateTime endTime, DbProfilePack profilePack)
        {
            if (dbModelWinder == null)
                return profilePack;
            GetPackMsg = "从收卷数据库加载数据";

            string startTime_str = startTime.ToStringOfSQLiteFieldType();
            string endTime_str = endTime.ToStringOfSQLiteFieldType();

            string condition =
                $"WHERE Time>={startTime_str}" +
                $" AND Time<={endTime_str}";

            var db_winderInfos = dbModelWinder.TbWinderInfo.Find(condition);
            profilePack.WinderInfos = db_winderInfos;

            return profilePack;
        }
        DbProfilePack GetProfilePack_Weight(DateTime startTime, DateTime endTime, DbProfilePack profilePack)
        {
            if (dbModelWeight == null)
                return profilePack;
            GetPackMsg = "从称重数据库加载流量数据";

            string startTime_str = startTime.ToStringOfSQLiteFieldType();
            string endTime_str = endTime.ToStringOfSQLiteFieldType();

            string condition =
                $"WHERE Time>={startTime_str}" +
                $" AND Time<={endTime_str}";

            var db_flows = dbModelWeight.TbFlow.Find(condition);
            var lc_flows = FLY.Weight.Server.Model.Lc_AutoMapperProfile.Mapper.Map<
                List<FLY.Weight.Server.Model.Db_Flow>, List<FLY.Weight.Server.Model.Lc_Flow>>(db_flows);
            profilePack.WeightFlows = lc_flows;

            GetPackMsg = "从称重数据库加载混料数据";

            var db_mixs = dbModelWeight.TbMix.Find(condition);
            var lc_mixs = FLY.Weight.Server.Model.Lc_AutoMapperProfile.Mapper.Map<
                List<FLY.Weight.Server.Model.Db_Mix>, List<FLY.Weight.Server.Model.Lc_Mix>>(db_mixs);
            profilePack.WeightMixs = lc_mixs;

            return profilePack;
        }
    }


    #region 链接表的关系
    /// <summary>
    /// 包装 DB_Profile, 组织 DB_Profile, DB_ScanData....
    /// </summary>
    public class DbProfilePack
    {
        public List<FLY.FeedbackRenZiJia.Server.Model.Lc_ThickHeat> ThickHeats;
        public List<FLY.IBC.Server.Model.Db_Width> Widths;
        public List<FLY.Winder.Server.Model.Db_WinderInfo> WinderInfos;

        public List<FLY.Weight.Server.Model.Lc_Flow> WeightFlows;
        public List<FLY.Weight.Server.Model.Lc_Mix> WeightMixs;

        public int GetTotalRow() {
            int sum = 0;
            sum += ThickHeats != null ? ThickHeats.Count() : 0;
            sum += Widths != null ? Widths.Count() : 0;
            sum += WinderInfos != null ? WinderInfos.Count() : 0;
            sum += WeightFlows != null ? WeightFlows.Count() : 0;
            sum += WeightMixs != null ? WeightMixs.Count() : 0;
            return sum;
        }
        public List<string> GetMsgs() {
            List<string> msgs = new List<string>();
            if (ThickHeats != null && ThickHeats.Count() > 0)
            {
                msgs.Add($"风环记录 {ThickHeats.Count()}条");
            }

            if (WeightFlows != null && WeightFlows.Count() > 0)
            {
                msgs.Add($"称重记录 {WeightFlows.Count()}条");
            }

            if (WinderInfos != null && WinderInfos.Count() > 0)
            {
                msgs.Add($"收卷记录 {WinderInfos.Count()}条");
            }

            if (Widths != null && Widths.Count() > 0)
            {
                msgs.Add($"IBC记录 {Widths.Count()}条");
            }
            return msgs;
        }
        public void GetDateRange(out DateTime beginTime, out DateTime endTime) {

            beginTime = DateTime.MinValue;
            endTime = DateTime.MinValue;

            if (ThickHeats != null && ThickHeats.Count() > 0)
            {
                var b = ThickHeats.First().Time;
                var e = ThickHeats.Last().Time;

                if (beginTime == DateTime.MinValue)
                {
                    beginTime = b;
                    endTime = e;
                }
                else
                {
                    if (b < beginTime)
                        beginTime = b;

                    if (e > endTime)
                        endTime = e;
                }
            }

            if (WeightFlows != null && WeightFlows.Count() > 0)
            {
                var b = WeightFlows.First().Time;
                var e = WeightFlows.Last().Time;

                if (beginTime == DateTime.MinValue)
                {
                    beginTime = b;
                    endTime = e;
                }
                else
                {
                    if (b < beginTime)
                        beginTime = b;

                    if (e > endTime)
                        endTime = e;
                }
            }

            if (WinderInfos != null && WinderInfos.Count() > 0)
            {
                var b = WinderInfos.First().Time;
                var e = WinderInfos.Last().Time;

                if (beginTime == DateTime.MinValue)
                {
                    beginTime = b;
                    endTime = e;
                }
                else
                {
                    if (b < beginTime)
                        beginTime = b;

                    if (e > endTime)
                        endTime = e;
                }
            }

            if (Widths != null && Widths.Count() > 0)
            {
                var b = Widths.First().Time;
                var e = Widths.Last().Time;

                if (beginTime == DateTime.MinValue)
                {
                    beginTime = b;
                    endTime = e;
                }
                else
                {
                    if (b < beginTime)
                        beginTime = b;

                    if (e > endTime)
                        endTime = e;
                }
            }
        }
    }
    #endregion



}