using ComPDFKitViewer;
using ComPDFKitViewer.PdfViewer;
using Microsoft.Office.Interop.Word;
using PDF_Office.Model;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Input;

namespace PDF_Office.ViewModels.PropertyPanel.ViewModular
{
    internal class PageContentViewModel : BindableBase, INavigationAware
    {
        private IRegionManager region;

        private IDialogService dialogs;
        public CPDFViewer PDFViewer { get; set; }
        private int pageCount;

        public int PageCount
        {
            get { return pageCount; }
            set
            {
                SetProperty(ref pageCount, value);
            }
        }

        private int currentPage;

        public int CurrentPage
        {
            get { return currentPage; }
            set
            {
                SetProperty(ref currentPage, value);
            }
        }

        private void GoPrePage()
        {
            if (PDFViewer != null)
            {
                PDFViewer.GoToPage(PDFViewer.CurrentIndex - 1);
            }
        }

        private bool CanPrePageExcute()
        {
            if (PDFViewer != null)
            {
                if (PDFViewer.CurrentIndex <= 0)
                    return false;
                else
                    return true;
            }
            return false;
        }

        private void GoNextPage()
        {
            if (PDFViewer != null)
            {
                PDFViewer.GoToPage(PDFViewer.CurrentIndex + 1);
                //双页模式 一次性跳两页
                if (((int)PDFViewer.ModeView > 2))
                {
                    PDFViewer.GoToPage(PDFViewer.CurrentIndex + 2);
                }
            }
        }

        private bool CanNextPageExcute()
        {
            if (PDFViewer != null)
            {
                if (PDFViewer.CurrentIndex >= PDFViewer.Document.PageCount - 1)
                    return false;
                else
                    return true;
            }
            return false;
        }

        private void GoFirstPage()
        {
            if (PDFViewer != null)
            {
                PDFViewer.GoToPage(0);
            }
        }

        private void GoLastPage()
        {
            if (PDFViewer != null)
            {
                PDFViewer.GoToPage(PDFViewer.Document.PageCount - 1);
            }
        }

        private int selectedIndex;

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

        private double currenZoom;

        public double CurrentZoom
        {
            get { return currenZoom; }
            set { SetProperty(ref currenZoom, value); }
        }

        public DelegateCommand<object> PageTextKeyDownCommand { get; set; }

        public DelegateCommand<object> PageTextPreviewKeyDownCommand { get; set; }

        public DelegateCommand<object> SelectionChangedCommand { get; set; }
        public DelegateCommand FirstPageCommand { get; set; }

        public DelegateCommand LastPageCommand { get; set; }

        public DelegateCommand PrePageCommand { get; set; }

        public DelegateCommand NextPageCommand { get; set; }

        public PageContentViewModel(IRegionManager regionManager, IDialogService dialogService)
        {
            region = regionManager;
            dialogs = dialogService;
            PrePageCommand = new DelegateCommand(GoPrePage, CanPrePageExcute).ObservesProperty(() => CurrentPage);
            NextPageCommand = new DelegateCommand(GoNextPage, CanNextPageExcute).ObservesProperty(() => CurrentPage);
            FirstPageCommand = new DelegateCommand(GoFirstPage, CanPrePageExcute).ObservesProperty(() => CurrentPage);
            LastPageCommand = new DelegateCommand(GoLastPage, CanNextPageExcute).ObservesProperty(() => CurrentPage);
            PageTextKeyDownCommand = new DelegateCommand<object>(PageNumText_KeyDown);
            PageTextPreviewKeyDownCommand = new DelegateCommand<object>(PageNumText_PreviewKeyDown);
            SelectionChangedCommand = new DelegateCommand<object>(SelectionChangedEvent);
        }

        private void SelectionChangedEvent(object e)
        {
            var args = e as SelectionChangedEventArgs;
            if (args != null)
            {
                if (SelectedIndex <= 2)
                {
                    switch (SelectedIndex)
                    {
                        case 0:
                            PDFViewer.ChangeFitMode(FitMode.FitSize);
                            break;

                        case 1:
                            PDFViewer.ChangeFitMode(FitMode.FitWidth);
                            break;

                        case 2:
                            PDFViewer.ChangeFitMode(FitMode.FitHeight);
                            break;

                        default:
                            break;
                    }
                }
                else
                {
                    if (args.AddedItems[0] is ComboBoxItem)
                    {
                        if ((args.AddedItems[0] as ComboBoxItem).Tag != null)
                        {
                            PDFViewer.Zoom(Convert.ToDouble((args.AddedItems[0] as ComboBoxItem).Tag.ToString()) / 100.0);
                        }
                    }
                }
            }
        }

        private void PageNumText_PreviewKeyDown(object e)
        {
            var args = e as KeyEventArgs;
            if (args != null)
            {
                //显示文本框输入内容
                List<Key> NumberKeys = new List<Key>() { Key.D0,Key.D1,Key.D2,Key.D3,Key.D4,Key.D5,Key.D6,Key.D7,Key.D8,Key.D9,Key.NumPad0,Key.NumPad1,Key.NumPad2,
                                                        Key.NumPad3,Key.NumPad4,Key.NumPad5,Key.NumPad6,Key.NumPad7,Key.NumPad8,Key.NumPad9,Key.Delete,Key.Back,Key.Enter,Key.Right,Key.Left};
                if (!NumberKeys.Contains(args.Key))
                {
                    args.Handled = true;
                }
            }
        }

        private void PageNumText_KeyDown(object e)
        {
            if (!(e is KeyEventArgs))
            {
                return;
            }
            //回车提交输入
            if ((e as KeyEventArgs).Key == System.Windows.Input.Key.Enter)
            {
                int pagenum = 0;
                string text = ((e as KeyEventArgs).OriginalSource as TextBox).Text.ToString();
                char[] chs = { ' ', '/', '\\' };//字符截取  拒止非法输入
                int i = text.LastIndexOfAny(chs);
                if (i > 0)
                {
                    text = text.Substring(0, i - 1);
                }

                if (!int.TryParse(text, out pagenum))
                {
                    CurrentPage = PDFViewer.Document.PageCount;
                    ((e as KeyEventArgs).OriginalSource as TextBox).Text = PDFViewer.Document.PageCount.ToString();
                    return;
                }
                if (pagenum < 1)
                {
                    pagenum = 1;
                }
                else if (pagenum > PDFViewer.Document.PageCount)
                {
                    pagenum = PDFViewer.Document.PageCount;
                }

                PDFViewer.GoToPage(pagenum - 1);
                CurrentPage = pagenum;
                ((e as KeyEventArgs).OriginalSource as TextBox).Text = pagenum.ToString();
            }
        }

        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
        }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            if (navigationContext.Parameters[ParameterNames.PDFViewer] is CPDFViewer viewer)
            {
                PDFViewer = viewer;
                PageCount = PDFViewer.Document.PageCount;
                CurrentPage = PDFViewer.CurrentIndex + 1;
                CurrentZoom = PDFViewer.ZoomFactor * 100;
                this.PDFViewer.InfoChanged += PDFViewer_InfoChanged;
            }
        }

        private void PDFViewer_InfoChanged(object sender, KeyValuePair<string, object> e)
        {
            if (e.Key == "PageNum")
            {
                RenderData renderData = e.Value as RenderData;
                if (renderData != null)
                {
                    CurrentPage = renderData.PageIndex;
                    PageCount = PDFViewer.Document.PageCount;
                }
            }
            if (e.Key == "SplieMode" || e.Key == "ViewMode")
            {
                return;
            }
            if (e.Key == "Zoom")
            {
                CurrentZoom = (double)e.Value * 100;
                SelectedIndex = -1;
            }
        }
    }
}