using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using StartServerWPF.Modules.Main;
using StartServerWPF.Modules.Main.models;
using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
using System.Windows;
using System.Windows.Threading;

namespace StartServerWPF.Modules.Main.ViewModels
{
    internal class FilesWatcherViewModel : BindableBase
    {
        public FilesWatcherViewModel(IEventAggregator ea)
        {
            string filter = "*.txt";
            string str = File.ReadAllText("systemconfig.json");
            WatcherPath = AppDomain.CurrentDomain.BaseDirectory;
            InitializeParams(filter);
            StartTime = DateTime.Now;
        }
        private string watcherPath;

        public string WatcherPath
        {
            get { return watcherPath; }
            set { SetProperty(ref watcherPath, value); }
        }

        private ObservableCollection<WatcherFileModel> dataList = new ObservableCollection<WatcherFileModel>();

        public ObservableCollection<WatcherFileModel> DataList

        {
            get { return dataList; }
            set { SetProperty(ref dataList, value); }
        }

        private DateTime startTime;
        public DateTime StartTime { get => startTime; set => SetProperty(ref startTime, value); }


       
        private int selectedIndex;

        public int SelectedIndex
        {
            get { return selectedIndex; }
            set { SetProperty(ref selectedIndex, value); }
        }

        public DelegateCommand StartCommand => new(Start);

        public DelegateCommand StopCommand => new(Stop);

        private void Start()
        {
            WatchStartOrSopt(true);
            StartTime=DateTime.Now; 
         //   _websocketClient.SendMes(JsonSerializer.Serialize(new CSUserSubscribeMessage { type = CSMessage.subscribe }));
        }

        private void Stop()
        {
            WatchStartOrSopt(false);
       //     _websocketClient.SendMes(JsonSerializer.Serialize(new CSUserSubscribeMessage { type = CSMessage.unsubscribe }));

        }

        public DelegateCommand FilePathSaveCommand => new(() =>
        { 
            System.Windows.Forms.FolderBrowserDialog fbd = new System.Windows.Forms.FolderBrowserDialog();
            fbd.SelectedPath = WatcherPath;
            fbd.Description = "请选择文件路径";
             fbd.ShowNewFolderButton = true;
            if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                if (fbd.SelectedPath != WatcherPath)
                {
                    WatcherPath = fbd.SelectedPath;
             //       systemConfig.FilePath = WatcherPath;
                    var options = new JsonSerializerOptions {
                        // 整齐打印
                        WriteIndented = true,
                        //重新编码，解决中文乱码问题
                        Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
                    };
                //    string message = JsonSerializer.Serialize(systemConfig, options);
                    if (File.Exists(settingDataPath))
                    {
                 //       File.WriteAllText(settingDataPath, message);
                    }
                }
            }
        });

        private string settingDataPath = "systemconfig.json";

        private void InitializeParams(string fileFilter)
        {

            SelectedIndex = 1;
            //如果设置的目录不存在设置到根目录
            if (!File.Exists(WatcherPath))
            {
                WatcherPath = AppDomain.CurrentDomain.BaseDirectory;
            }
            watcher = new FileSystemWatcher();
            //初始化监听
            watcher.BeginInit();

            //设置需要监听的更改类型(如:文件或者文件夹的属性,文件或者文件夹的创建时间;NotifyFilters枚举的内容)
            watcher.NotifyFilter = NotifyFilters.Attributes
                                 | NotifyFilters.CreationTime
                                 | NotifyFilters.DirectoryName
                                 | NotifyFilters.FileName
                                 | NotifyFilters.LastAccess
                                 | NotifyFilters.LastWrite
                                 | NotifyFilters.Security
                                 | NotifyFilters.Size;
            //设置监听的路径
            watcher.Path = WatcherPath;
            watcher.Changed += new FileSystemEventHandler(Watcher_Changed);
           // watcher.Created += Watcher_Created;
            watcher.Deleted += new FileSystemEventHandler(Watcher_Deleted);
            watcher.Renamed += new RenamedEventHandler(Watcher_Renamed);
            watcher.Error += OnError;

            //设置监听文件类型
            watcher.Filter = fileFilter;
            //设置是否监听子目录
            watcher.IncludeSubdirectories = false;
            //设置是否启用监听
            watcher.EnableRaisingEvents = false;
            watcher.EndInit();

        }

        private string DateDiff(DateTime DateTime1, DateTime DateTime2)
        {
            string dateDiff = null;
            TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
            TimeSpan ts2 = new
            TimeSpan(DateTime2.Ticks);
            TimeSpan ts = ts1.Subtract(ts2).Duration();
            if (ts.Days > 0)
            {
                dateDiff += ts.Days.ToString() + "天";
            }
            if (ts.Hours > 0)
            {
                dateDiff += ts.Hours.ToString() + "小时";
            }
            if (ts.Minutes > 0)
            {
                dateDiff += ts.Minutes.ToString() + "分钟";
            }

            dateDiff += ts.Seconds.ToString() + "秒";
            return dateDiff;
        }
        private void OnError(object sender, ErrorEventArgs e)
        {

        }
        private void Watcher_Changed(object sender, System.IO.FileSystemEventArgs e)
        {
            //    DateTime dt = DateTime.Now;
            // string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
            DateTime lastWriteTime = File.GetLastWriteTime(e.FullPath);
            watcher.EnableRaisingEvents = false;
            Debug.WriteLine($"最后修改时间：{lastWriteTime}");
            string lastLine = File.ReadAllLines(e.FullPath).Last().Trim();
            var str=  dataList.Where(f => f.Data == lastLine).FirstOrDefault();
            if (!string.IsNullOrWhiteSpace(lastLine)
                && str==null)
            {
                System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
                {
                    DataList.Add(new WatcherFileModel
                    {
                        CreateTime = DateTime.Now.ToString(),
                        ChangeType = e.ChangeType,
                        Name = e.Name,
                        FullPath = e.FullPath,
                        Data = lastLine,
                        IsSend = false
                    });
                }));
            }
            watcher.EnableRaisingEvents = true;
        }

        private void Watcher_Renamed(object sender, RenamedEventArgs e)
        {
            System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => {

                DateTime dt = DateTime.Now;
                string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
                tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
                tmp += "文件全称:" + e.FullPath + "\r\n";
                //DataList.Add(new WatcherFileModel
                //{
                //    CreateTime = DateTime.Now.ToString(),
                //    ChangeType = e.ChangeType,
                //    Name = e.Name,
                //    FullPath = e.FullPath,
                //    Data = tmp
                //});
            }));
        }

        private void Watcher_Created(object sender, FileSystemEventArgs e)
        {
            DateTime dt = DateTime.Now;
            string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
            tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
            tmp += "文件全称:" + e.FullPath + "\r\n";
            //DataList.Add(new WatcherFileModel
            //{
            //    CreateTime = DateTime.Now.ToString(),
            //    ChangeType = e.ChangeType,
            //    Name = e.Name,
            //    FullPath = e.FullPath,
            //    Data = tmp
            //});
        }

        private void Watcher_Deleted(object sender, FileSystemEventArgs e)
        {

            DateTime dt = DateTime.Now;
            string tmp = dt.Hour.ToString() + "时" + dt.Minute.ToString() + "分" + dt.Second.ToString() + "秒" + dt.Millisecond.ToString() + "毫秒,目录发生变化\r\n";
            tmp += "改变类型 :" + e.ChangeType.ToString() + "\r\n"; ;
            tmp += "文件全称:" + e.FullPath + "\r\n";
            // DataList.Add(new WatcherFileModel
            //{
            //    CreateTime= DateTime.Now.ToString(),               
            //    ChangeType=e.ChangeType,
            //    Name=e.Name,
            //    FullPath= e.FullPath,
            //     Data=tmp
            //});
        }

        /// <summary>
        /// 启动或者停止监听
        /// </summary>
        /// <param name="IsEnableRaising">True:启用监听,False:关闭监听</param>
        private void WatchStartOrSopt(bool IsEnableRaising)
        {
            watcher.EnableRaisingEvents = IsEnableRaising;
        }
    
        private FileSystemWatcher watcher = new FileSystemWatcher();
    }
}
