using GalaSoft.MvvmLight.Command;
using MahApps.Metro.Controls;
using MahApps.Metro.Controls.Dialogs;
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using FLY.Blowing.DbViewer.Core;
using System.Collections.Generic;
using System.Windows.Navigation;

namespace FLY.Blowing.DbViewer
{
    /// <summary>
    /// PageSelect.xaml 的交互逻辑
    /// </summary>
    public partial class PageSelect : Page
    {
        PageSelectVm viewModel;
        DbViewerModel dBViewerModel;
        public PageSelect()
        {
            InitializeComponent();
        }
        [Unity.InjectionMethod]
        public void Init(DbViewerModel dBViewerModel)
        {
            this.dBViewerModel = dBViewerModel;
            viewModel = new PageSelectVm();
            viewModel.Init(dBViewerModel);
            this.DataContext = viewModel;

            viewModel.SearchSuccessEvent += ViewModel_SearchSuccessEvent;
        }

        private void ViewModel_SearchSuccessEvent(object sender, EventArgs e)
        {
            this.NavigationService.GoBack();
            this.NavigationService.RemoveBackEntry();
        }

        private void ButtonBack_Click(object sender, RoutedEventArgs e)
        {
            this.NavigationService.GoBack();
            this.NavigationService.RemoveBackEntry();
        }

    }
    public class PageSelectVm : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;


        public DateTime BeginDate { get; set; }
        public DateTime EndDate { get; set; }

        public RelayCommand ButtonSearchCmd { get; private set; }

        public DbHelper DbHelper { get; private set; }
        DbViewerModel dBViewerModel;
        public event EventHandler SearchSuccessEvent;
        public PageSelectVm()
        {

            ButtonSearchCmd = new RelayCommand(Search);



        }
        public void Init(DbViewerModel dBViewerModel) {
            this.dBViewerModel = dBViewerModel;
            DbHelper = dBViewerModel.mDbHelper;

            BeginDate = DateTime.Now.AddDays(-1);
            EndDate = DateTime.Now;

        }

        ProgressDialogController controller;
        async void Search()
        {
            controller = await App.MetroWindow.ShowProgressAsync("请等待...", "开始搜索",
                settings: new MetroDialogSettings()
                {
                    NegativeButtonText = "停止",
                    AnimateShow = false,
                    AnimateHide = false,

                });
            //controller.SetCancelable(true);
            controller.SetIndeterminate();
            DbHelper.PropertyChanged += DbHelper_PropertyChanged;
            await Task.Run(() =>
            {
                dBViewerModel.Pack = DbHelper.GetPack(BeginDate, EndDate);

            });
            DbHelper.PropertyChanged -= DbHelper_PropertyChanged;

            await controller.CloseAsync();
            controller = null;


            List<string> msgs = dBViewerModel.Pack.GetMsgs();
            dBViewerModel.Pack.GetDateRange(out DateTime beginTime, out DateTime endTime);
            
            if (msgs.Count() == 0)
            {
                await App.MetroWindow.ShowMessageAsync("搜索失败", "不能获取任何数据");

                dBViewerModel.IsPackReady = false;
            }
            else
            {
                dBViewerModel.IsPackReady = true;
                dBViewerModel.PackBeginDate = beginTime;
                dBViewerModel.PackEndDate = endTime;
                dBViewerModel.PackMsgs.Clear();

                string msg = "";
                for (int i = 0; i < msgs.Count(); i++)
                {
                    if (!string.IsNullOrEmpty(msg)) {
                        msg += "; ";
                    }
                    msg += msgs[i];
                    dBViewerModel.PackMsgs.Add(msgs[i]);
                }
                await App.MetroWindow.ShowMessageAsync("搜索成功", msg);

                if (msgs.Count() > 0)
                {
                    SearchSuccessEvent?.Invoke(this, null);
                    
                }
            }

            return;
        }

        private void DbHelper_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            var dbHelper = sender as DbHelper;
            if (e.PropertyName == nameof(DbHelper.GetPackMsg)) {
                controller.SetMessage(dbHelper.GetPackMsg);
            }
        }
    }
    public class PageSelectVmUt : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public DateTime StartTime { get; set; }
        public DateTime EndTime { get; set; }

        public DbHelper DbHelper { get; set; } = new DbHelper();
        public PageSelectVmUt()
        {
            StartTime = DateTime.Now.AddDays(-1);
            EndTime = DateTime.Now;

        }
    }
}