using CommunityToolkit.Mvvm.Input;
using FLY.Thick.FilmCasting.Server.Model;
using FLY.Thick.FilmCasting.UI.DbViewer.Core;
using FLY.Thick.FilmCasting.UI.DbViewer.Db;
using MahApps.Metro.Controls;
using MahApps.Metro.Controls.Dialogs;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace FLY.Thick.FilmCasting.UI.DbViewer
{
    /// <summary>
    /// PageSelect.xaml 的交互逻辑
    /// </summary>
    public partial class PgSelect : Page
    {
        PgSelectVm viewModel;
        DbViewerModel dbViewerModel;
        public PgSelect()
        {
            InitializeComponent();
        }

        [Unity.InjectionMethod]
        public void Init(DbViewerModel dBViewerModel)
        {
            this.dbViewerModel = dBViewerModel;
            viewModel = new PgSelectVm();
            viewModel.Init(dbViewerModel, dgridProfiles);
            this.DataContext = viewModel;

            viewModel.OkSuccessEvent += 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 PgSelectVm : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;


        public DateTime BeginDate { get; set; }
        public DateTime EndDate { get; set; }
        public string ProductNameFilter { get; set; }
        public string BatchFilter { get; set; }

        public ObservableCollection<Db_Profile> Profiles { get; } = new ObservableCollection<Db_Profile>();
        //public ObservableCollection<Db_Profile> SelectedItems { get; } = new ObservableCollection<Db_Profile>();

        public string MonthPath { get; private set; }
        public DateTime DbBeginTime { get; private set; }
        public DateTime DbEndTime { get; private set; }

        #region CMD
        public RelayCommand SearchCmd { get; private set; }
        public RelayCommand DeleteCmd { get; private set; }
        public RelayCommand OkCmd { get; private set; }

        public RelayCommand SelectMonthPathCmd { get; private set; }
        #endregion
        public DbHelper DbHelper => dbHelper;
        DbViewerModel dbViewerModel;
        DataGrid dgridProfiles;
        DbHelper dbHelper;
        public event EventHandler OkSuccessEvent;

        public PgSelectVm()
        {
            SearchCmd = new RelayCommand(Search);
            DeleteCmd = new RelayCommand(Delete);
            OkCmd = new RelayCommand(Ok);
            SelectMonthPathCmd = new RelayCommand(SelectMonthPath);
        }



        public void Init(DbViewerModel dbViewerModel, DataGrid dgridProfiles)
        {
            this.dbViewerModel = dbViewerModel;
            this.dbHelper = dbViewerModel.mDbHelper;
            this.dgridProfiles = dgridProfiles;


            Misc.BindingOperations.SetBinding(dbHelper, nameof(dbHelper.MonthPath), () =>
            {
                if (string.IsNullOrEmpty(this.dbHelper.MonthPath))
                {
                    MonthPath = "最近2个月";
                }
                else
                {
                    MonthPath = this.dbHelper.MonthPath;
                }
            });

            updateDate();
            dbHelper.PropertyChanged += DbHelper_PropertyChanged;


        }

        private void DbHelper_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if ((e.PropertyName == nameof(dbHelper.DbEndTime)) || (e.PropertyName == nameof(dbHelper.DbBeginTime)))
            {
                updateDate();
            }
        }

        void updateDate()
        {
            DbEndTime = dbHelper.DbEndTime;
            DbBeginTime = dbHelper.DbBeginTime;
            EndDate = DbEndTime;
            try
            {
                BeginDate = EndDate.AddDays(-1);
            }
            catch (Exception e) {
                BeginDate = EndDate;
            }
        }
        private async void SelectMonthPath()
        {
            DgSelectMonth dialog = new DgSelectMonth();
            dialog.Init(dbHelper); ;
            await App.MetroWindow.ShowMetroDialogAsync(dialog);
        }

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

                });
            //controller.SetCancelable(true);
            controller.SetIndeterminate();

            var list = dbHelper.GetProfileList(BeginDate, EndDate, ProductNameFilter, BatchFilter);
            Profiles.Clear();
            foreach (var p in list)
            {
                Profiles.Add(p);
            }

            await controller.CloseAsync();
            await App.MetroWindow.ShowMessageAsync("搜索完成",
                    $"搜索结果 为 {Profiles.Count}条");
            return;
        }

        async void Delete()
        {

            var SelectedItems = dgridProfiles.SelectedItems;
            if (SelectedItems.Count == 0)
            {
                await App.MetroWindow.ShowMessageAsync("删除异常",
                    $"没有选择任何一个记录！！");
                return;
            }
            var result = await App.MetroWindow.ShowMessageAsync("警告",
                   $"是否确定删除这些记录?",
                   MessageDialogStyle.AffirmativeAndNegative,
                   new MetroDialogSettings()
                   {
                       AffirmativeButtonText = "确定删除",
                       NegativeButtonText = "取消",
                       DefaultButtonFocus = MessageDialogResult.Negative,
                       ColorScheme = MetroDialogColorScheme.Inverted
                   });
            if (result != MessageDialogResult.Affirmative)
            {
                return;
            }

            List<Db_Profile> dels = new List<Db_Profile>();
            foreach (Db_Profile p in SelectedItems)
            {
                dbHelper.DeleteProfile(p);
                dels.Add(p);
            }
            foreach (var del in dels)
                Profiles.Remove(del);

            SelectedItems.Clear();


            await App.MetroWindow.ShowMessageAsync("删除完成",
                    $"删除 {dels.Count}条 数据");
            return;
        }

        async void Ok()
        {
            var SelectedItems = dgridProfiles.SelectedItems;
            if (SelectedItems.Count == 0)
            {
                await App.MetroWindow.ShowMessageAsync("加载异常",
                    $"没有选择任何一个记录,也许忘记按 【搜索】 了！！");
                return;
            }

            //开始加载
            var controller = await App.MetroWindow.ShowProgressAsync("请等待...", "开始加载数据",
                settings: new MetroDialogSettings()
                {
                    NegativeButtonText = "停止",
                    AnimateShow = false,
                    AnimateHide = false,
                });
            //controller.SetCancelable(true);
            controller.SetIndeterminate();


            List<Db_Profile> profiles = new List<Db_Profile>();
            if (SelectedItems.Count > 0)
            {
                foreach (Db_Profile p in SelectedItems)
                {
                    profiles.Add(p);
                }
                //按顺序排列
                profiles.Sort((p1, p2) =>
                {
                    return p1.ID.CompareTo(p2.ID);
                });
            }
            bool ret = await Task.Factory.StartNew(() =>
            {
                return dbViewerModel.GetProfilePacks(profiles);
            });



            if (!ret)
            {
                //获取出错
                await controller.CloseAsync();
                await ((MetroWindow)Application.Current.MainWindow).ShowMessageAsync("加载出错", "数据异常，请检测数据库");
                return;
            }

            await controller.CloseAsync();

            string msg = $"扫描数据 {dbViewerModel.ProfilePacks.Sum(p => p.ScanDatas.Count())}幅";

            //加载成功
            await ((MetroWindow)Application.Current.MainWindow).ShowMessageAsync("加载成功", msg);
            OkSuccessEvent?.Invoke(this, null);

        }
    }
    public class PgSelectVmUt : PgSelectVm
    {

    }
}
