using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ComPDFKitViewer.PdfViewer;
using PDF_Master.Model;
using Prism.Commands;
using System.Windows.Controls;
using DryIoc;
using Prism.Services.Dialogs;
using PDF_Master.Views.PageEdit;
using PDF_Master.Properties;
using PDF_Master.Helper;

namespace PDF_Master.ViewModels.BOTA
{
    public class BOTAContentViewModel : BindableBase, INavigationAware
    {
        public CPDFViewer pdfViewer { get; set; }

        private IRegionManager regions { get; set; }
        private IDialogService dialogs { get; set; }

        public ViewContentViewModel viewContentViewModel { get; set; }

        private Dictionary<string, string> viewNameByTabItem;

        private string botaContentRegionName;

        public string BOTAContentRegionName
        {
            get { return botaContentRegionName; }
            set
            {
                SetProperty(ref botaContentRegionName, value);
            }
        }

        private int selectedIndex;

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

        private string tip_Thumbnail;

        public string Tip_Thumbnail
        {
            get { return tip_Thumbnail; }
            set
            {
                SetProperty(ref tip_Thumbnail, value);
            }
        }

        private string tip_OutLine;

        public string Tip_OutLine
        {
            get { return tip_OutLine; }
            set
            {
                SetProperty(ref tip_OutLine, value);
            }
        }

        private string tip_BookMark;

        public string Tip_BookMark
        {
            get { return tip_BookMark; }
            set
            {
                SetProperty(ref tip_BookMark, value);
            }
        }

        private string tip_Search;

        public string Tip_Search
        {
            get { return tip_Search; }
            set
            {
                SetProperty(ref tip_Search, value);
            }
        }

        private string tip_Annote;

        public string Tip_Annote
        {
            get { return tip_Annote; }
            set
            {
                SetProperty(ref tip_Annote, value);
            }
        }

        public string CurrentBar = "";

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

        public BOTAContentViewModel(IRegionManager regionManager, IDialogService dialogService)
        {
            regions = regionManager;
            dialogs = dialogService;
            BOTAContentRegionName = Guid.NewGuid().ToString();
            TabControlSelectionChangedCommand = new DelegateCommand<object>(TabControlSelectionChangedEvent);
            viewNameByTabItem = new Dictionary<string, string>();
            InitDictionartViewNameByTabItem(ref viewNameByTabItem);

            InitString();
        }

        private void TabControlSelectionChangedEvent(object e)
        {
            var args = e as SelectionChangedEventArgs;
            if (args != null&&args.AddedItems.Count>0)
            {
                if (!string.IsNullOrEmpty((args.AddedItems[0] as TabItem).Name))
                {
                    EnterSelectedBar((args.AddedItems[0] as TabItem).Name);
                    if((args.AddedItems[0] as TabItem).IsSelected)
                    {
                        viewContentViewModel.OpenBOTA = true;
                    }
                }
            }
        }

        private void InitString()
        {
            Tip_Annote = App.MainPageLoader.GetString("ViewTopToolbar_Annotation");
            Tip_OutLine = App.MainPageLoader.GetString("Outline_Title");
            Tip_BookMark = App.MainPageLoader.GetString("Bookmark_Title");
            Tip_Search = App.MainPageLoader.GetString("ViewRightMenu_Search");
            Tip_Thumbnail = App.MainPageLoader.GetString("Thumbnails_Title");
        }

        /// <summary>
        /// 初始化名称-视图字典
        /// </summary>
        private void InitDictionartViewNameByTabItem(ref Dictionary<string, string> viewNameByTabItem)
        {
            //绑定tabitem名字和对应的View控件名称
            viewNameByTabItem.Add("TabItemThumbnail", "PageEditContent");
            viewNameByTabItem.Add("TabItemOutLine", "OutLineControl");
            viewNameByTabItem.Add("TabItemBookMark", "BookmarkContent");
            viewNameByTabItem.Add("TabItemAnnotation", "AnnotationContent");
            viewNameByTabItem.Add("TabItemSearch", "SearchContent");
            viewNameByTabItem.Add("TabItemForm", "");
            viewNameByTabItem.Add("TabItemSign", "");
        }

        /// <summary>
        /// 导航至目标TabItem
        /// </summary>
        /// <param name="currentBar"></param>
        private void EnterSelectedBar(string currentBar)
        {
            //增加判空逻辑
            if (!string.IsNullOrEmpty(currentBar))
            {
                CurrentBar = currentBar;
                NavigationParameters param = new NavigationParameters();
                param.Add(ParameterNames.PDFViewer, pdfViewer);
                param.Add(ParameterNames.ViewContentViewModel, viewContentViewModel);
                if (currentBar == "TabItemThumbnail")
                {
                    param.Add(ParameterNames.BOTAThumb, true);
                }
                if (viewNameByTabItem.ContainsKey(currentBar))
                {
                    regions.RequestNavigate(BOTAContentRegionName, viewNameByTabItem[currentBar], param);
                }

                //增加判空逻辑
                if (pdfViewer != null && pdfViewer.Document != null)
                {
                    var info = SettingHelper.GetFileInfo(pdfViewer.Document.FilePath);
                    if (info != null)
                    {
                        info.BOTASelectedTab = currentBar;
                        info.BOTASelectedInex = SelectedIndex;
                        SettingHelper.SetFileInfo(info);
                    }
                }
            }
        }

        /// <summary>
        /// 根据缓存判断,如果记录需要展开BOTA 则还原上一次的展开状态
        /// </summary>
        public void OpenBOTA()
        {
            //记录上一次BOTA展开情况
            if (Settings.Default.AppProperties.InitialVIew.RememberBOTA)
            {
                //如果是加密文档 则先不展开,解密后再展开
                if(pdfViewer.Document.IsLocked)
                {
                    return;
                }
                var info = SettingHelper.GetFileInfo(pdfViewer.Document.FilePath);
                //避免新文档因打开文件没有selectedTab信息导致崩溃
                if (info != null && !string.IsNullOrEmpty(info.BOTASelectedTab))
                {
                    SelectedIndex = info.BOTASelectedInex;
                    EnterSelectedBar(info.BOTASelectedTab);
                    viewContentViewModel.OpenBOTA = true;
                }
            }
        }

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

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
        }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            var contentViewModel = navigationContext.Parameters[ParameterNames.ViewContentViewModel] as ViewContentViewModel;
            if (contentViewModel != null)
            {
                viewContentViewModel = contentViewModel;
                contentViewModel.botaViewModel = this;
            }
            var pdfview = navigationContext.Parameters[ParameterNames.PDFViewer] as CPDFViewer;
            if (pdfview != null)
            {
                pdfViewer = pdfview;
            }

            //大纲和文档同时打开
            if (Settings.Default.AppProperties.InitialVIew.ShowOutLine && pdfViewer.Document.GetOutlineList().Count > 0)
            {
                SelectedIndex = 2;
                EnterSelectedBar("TabItemOutLine");
                viewContentViewModel.OpenBOTA = true;
            }

            //确认是否要展开BOTA
            OpenBOTA();
        }

        #endregion Navigate
    }
}