using LiveChartsCore.Geo;
using SkiaSharp;
using SunlightCentralizedControlManagement_SCCM_.UserClass;
using SunlightCentralizedControlManagement_SCCM_.UserControls;
using SunlightCentralizedControlManagement_SCCM_.ViewModel;
using SunlightCentralizedControlManagement_SCCM_.ConvertMoels;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using static SunlightCentralizedControlManagement_SCCM_.UserClass.SqliteHelper;
using System.Windows.Threading;
using Newtonsoft.Json.Linq;
using System.Xml.Linq;
using static System.Windows.Forms.AxHost;
namespace SunlightCentralizedControlManagement_SCCM_.View
{
    /// 
    /// MachinesSet.xaml 的交互逻辑
    /// 
    public partial class DispenseView : UserControl
    {
        public DispenseView()
        {
            InitializeComponent();
        }
        private SQLiteHelper SQLiteHelpers = null;  //定义数据库
        private readonly string DBAddress = Environment.CurrentDirectory + "\\DataBase\\SCCM.db";  //数据库路径
        private readonly UserClass.IniFile.IniFiles Configini = new UserClass.IniFile.IniFiles(Convert.ToString(System.AppDomain.CurrentDomain.BaseDirectory) + "SCCM.ini");
        DataTable DispenseMac = new DataTable();
        UserControls.DispenseMacInfo[] dispenseMacInfo = new UserControls.DispenseMacInfo[99]; //定义总览信息卡
        //private string SYS_machines = null;
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            SQLiteHelpers = new SQLiteHelper(DBAddress);
            SQLiteHelpers.Open();  //打开数据库
            DispenseMac = SQLiteHelpers.ExecuteDataSet("select * from MachinesDispense ", null).Tables[0];//缓存             
            SQLiteHelpers.Close();
            /// 
            /// 生成总览信息卡
            /// 
            for (int i = 0; i < DispenseMac.Rows.Count; i++)
            {
                string x = DispenseMac.AsEnumerable().Select(row => row.Field("State")).ElementAt(i);
                bool y = DispenseMac.AsEnumerable().Select(row => row.Field("LOCK")).ElementAt(i);
                dispenseMacInfo[i] = new UserControls.DispenseMacInfo();
                dispenseMacInfo[i].Margin = new Thickness(5, 5, 0, 5);
                dispenseMacInfo[i].Width = 400;
                dispenseMacInfo[i].Height = 600;
                dispenseMacInfo[i].IP.Text = DispenseMac.AsEnumerable().Select(row => row.Field("IP")).ElementAt(i);
                dispenseMacInfo[i].USER.Text = DispenseMac.AsEnumerable().Select(row => row.Field("User")).ElementAt(i);
                dispenseMacInfo[i].PORT.Text = DispenseMac.AsEnumerable().Select(row => row.Field("PORT")).ElementAt(i).ToString();
                dispenseMacInfo[i].PASSWD.Text = DispenseMac.AsEnumerable().Select(row =>   row.Field("Password")).ElementAt(i);
                dispenseMacInfo[i].type_.Text = DispenseMac.AsEnumerable().Select(row => row.Field("type")).ElementAt(i).ToString();
                dispenseMacInfo[i].type_N.Text = StatenClassConvert.Convert(DispenseMac.AsEnumerable().Select(row => row.Field("type")).ElementAt(i));
                dispenseMacInfo[i].mac.Text = DispenseMac.AsEnumerable().Select(row => row.Field("name")).ElementAt(i);
                dispenseMacInfo[i].macg.Text = DispenseMac.AsEnumerable().Select(row => row.Field("Groups")).ElementAt(i);
                dispenseMacInfo[i].state.Text = StatenClassConvert.Convert(x);
                if (x == "899")
                {
                    dispenseMacInfo[i].state.Background = new SolidColorBrush(Color.FromRgb(255, 0, 0));
                }
                else
                {
                    dispenseMacInfo[i].state.Background = new SolidColorBrush(Color.FromRgb(255, 255, 255));
                }
                dispenseMacInfo[i].WorkingStatus.Text = DispenseMac.AsEnumerable().Select(row => row.Field("WorkingStatus")).ElementAt(i);
                if (y)
                {
                    dispenseMacInfo[i].mlock.Visibility = Visibility.Visible;
                }
                else
                {
                    dispenseMacInfo[i].mlock.Visibility = Visibility.Collapsed;
                }
                //dispenseMacInfo[i].name.Text = Selet_Machines(MainWindowViewModel.Machines, "name", i).ToString();
                //  dispenseMacInfo[i].IMAGE = ;
                MemoryStream memoryStream = new MemoryStream(DispenseMac.AsEnumerable().Select(row => row.Field("DATA")).ElementAt(i));
                //数据流生成图片显示
                BitmapImage bitmapImage = new BitmapImage();
                bitmapImage.BeginInit();
                bitmapImage.StreamSource = memoryStream;
                bitmapImage.EndInit();
                dispenseMacInfo[i].IMAGE.Source = bitmapImage;
                DispenseMacView.Children.Add(dispenseMacInfo[i]);
                CountDown();
            }
        }
        private void CountDown()
        {
            DispatcherTimer timer1s = new DispatcherTimer//初始化循环,每10秒调用一次Tick
            {
                Interval = TimeSpan.FromSeconds(10)//秒
            };
            timer1s.Tick += Tick_Event_1S;
            timer1s.Start();
        }//时间周期初始化
        async void Tick_Event_1S(object sender, EventArgs e)//Tick_Event周期执行事件1S
        {
            for (int i = 0; i < DispenseMac.Rows.Count; i++)
            {
                if (await PingTest(dispenseMacInfo[i].IP.Text))
                {
                    DataRow drEmployee = DispenseMac.Select("IP='" + dispenseMacInfo[i].IP.Text + "'").First();
                    drEmployee.BeginEdit();
                    drEmployee["State"] = "802";
                    drEmployee.EndEdit();
                    drEmployee.AcceptChanges();
                    drEmployee.ClearErrors();
                }
                    
                string x = DispenseMac.AsEnumerable().Select(row => row.Field("State")).ElementAt(i);
                bool y = DispenseMac.AsEnumerable().Select(row => row.Field("LOCK")).ElementAt(i);
                dispenseMacInfo[i].state.Text = StatenClassConvert.Convert(x);
                dispenseMacInfo[i].WorkingStatus.Text = DispenseMac.AsEnumerable().Select(row => row.Field("WorkingStatus")).ElementAt(i);
                if (x == "899")
                {
                    dispenseMacInfo[i].state.Background = new SolidColorBrush(Color.FromRgb(255, 0, 0)); 
                    dispenseMacInfo[i].Disconnect.Visibility = Visibility.Visible;
                }
                else
                {
                    dispenseMacInfo[i].state.Background = new SolidColorBrush(Color.FromRgb(255, 255, 255));
                    dispenseMacInfo[i].Disconnect.Visibility = Visibility.Collapsed;
                }
                if (y)
                {
                    dispenseMacInfo[i].mlock.Visibility = Visibility.Visible;
                }
                else
                {
                    dispenseMacInfo[i].mlock.Visibility = Visibility.Collapsed;
                }
            }
        }
        private async Task PingTest(string ip)
        {
            bool result = false;
            Ping pingSender = new Ping();
            try
            {
                PingReply reply = await pingSender.SendPingAsync(ip, 3000);
                if (reply.Status == IPStatus.Success)
                {
                    result = true;
                }
            }
            catch (PingException )
            {
                result = false;
            }
            return result;
        }
    }
}