using Microsoft.Win32;
using PDF_Office.EventAggregators;
using PDF_Office.Helper;
using PDF_Office.Model;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace PDF_Office.ViewModels
{
    public class HomeContentViewModel : BindableBase, INavigationAware
    {
        private string fileName = "Home";
        public string FileName
        {
            get { return fileName; }
            set { SetProperty(ref fileName, value); }
        }

        private string regionName;

        public string ToolRegionName
        {
            get { return regionName; }
            set { SetProperty(ref regionName, value); }
        }

        private Visibility isLoading = Visibility.Collapsed;

        public Visibility IsLoading
        {
            get { return isLoading; }
            set
            {
                SetProperty(ref isLoading, value);
            }
        }

        private MainContentViewModel mainContentViewModel;

        public DelegateCommand OpenFileCommand { get; set; }

        public DelegateCommand<string> ShowToolCommand { get; set; }

        public DelegateCommand CreateBlackPDFCommand { get; set; }

        public DelegateCommand CreateFromOtherFile { get; set; }

        public DelegateCommand CreateFromHtmlCommnd { get; set; }

        public DelegateCommand CreateFromScanner { get; set; }

        public IRegionManager toolregion;

        public IEventAggregator eventer;

        public IDialogService dialog;

        public HomeContentViewModel(IRegionManager regionManager, IEventAggregator eventAggregator, IDialogService dialogaware)
        {
            toolregion = regionManager;
            eventer = eventAggregator;
            dialog = dialogaware;

            ToolRegionName = RegionNames.ToolRegionName;
            OpenFileCommand = new DelegateCommand(OpenFile);
            ShowToolCommand = new DelegateCommand<string>(ShowToolContent);
            CreateBlackPDFCommand = new DelegateCommand(CreatBlankPDF);
            CreateFromOtherFile = new DelegateCommand(createFromOtherFile);
            CreateFromHtmlCommnd = new DelegateCommand(createFormHtml);
            CreateFromScanner = new DelegateCommand(createFromScanner);

            System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
            {
                toolregion.RequestNavigate(ToolRegionName, "Guid");
            }));
        }

        /// <summary>
        /// 显示右侧不同的工具栏页面
        /// </summary>
        /// <param name="view"></param>
        public void ShowToolContent(string view)
        {
            toolregion.RequestNavigate(ToolRegionName, view);
        }

        /// <summary>
        /// 从其他格式文件创建PDF
        /// </summary>
        private async void createFromOtherFile()
        {
            string txt = Properties.Resources.txtex;
            string word = Properties.Resources.wordex;
            string ppt = Properties.Resources.pptex;
            string excel = Properties.Resources.excelex;
            string html = Properties.Resources.htmlex;
            string image = Properties.Resources.imageex;
            string allfiles = txt + word + excel + ppt + image+html;
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Multiselect = true;
            dialog.Filter = string.Format($"Files({allfiles.Replace(";",",")}|{allfiles})|" +
           $"Microsoft Office Word({word})|{word}|" +
           $"Microsoft Office Excel({excel})|{excel}|" +
           $"Microsoft Office PowerPoint({ppt})|{ppt}|" +
           $"Txt({txt})|{txt}|" +
           $"Picture({image})|{image}|" +
           $"Html({html})|{html}");

            if((bool)dialog.ShowDialog())
            {
                var fileList = dialog.FileNames.ToList().Where(x => !App.OpenedFileList.Exists(y => y == x)).ToList();
                if (fileList.Count <= 0)
                    return;

                IsLoading = Visibility.Visible;
                //在当前页签打开第一个文件
                var type = System.IO.Path.GetExtension(fileList[0]).ToLower();
                if(image.Contains(type))
                {
                    //图片文件
                    mainContentViewModel.CreateFile(fileList[0]);
                }
                else
                {
                    await mainContentViewModel.CreateFileFromOffice(fileList[0]);
                }
                for (int i = 1; i < fileList.Count(); i++)
                {
                    if (!App.OpenedFileList.Contains(fileList[i]))
                    {
                        //需要加一定延时 不然连续添加多个文件时会出现regionname重名的情况 因为多处导航是异步导航,可能绑定还没更新
                        await Task.Delay(20);
                        App.mainWindowViewModel.AddTabItem(fileList[i]);
                    }
                    ToolMethod.SetFileThumbImg(fileList[i]);
                }
                IsLoading = Visibility.Collapsed;
            }
        }

        /// <summary>
        /// 从网页创建PDF文件
        /// </summary>
        private async void createFormHtml()
        {

            IsLoading = Visibility.Visible;
            await Task.Delay(20);

            dialog.ShowDialog(DialogNames.CreateFromHtmlDialog, async e =>{ 
                if(e.Result== ButtonResult.OK)
                {
                    var model = e.Parameters.GetValue<Model.Dialog.HomePageToolsDialogs.HtmlModel>(ParameterNames.DataModel);
                    await mainContentViewModel.CreateFileFromOffice(model.FilePath,model.PageSize,model.Margin);
                    IsLoading = Visibility.Collapsed;
                }
            });
   
        }

        /// <summary>
        /// 从扫描仪创建
        /// </summary>
        private void createFromScanner()
        {

        }

        /// <summary>
        /// 打开文件
        /// </summary>
        public async void OpenFile()
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = Properties.Resources.OpenDialogFilter;
            openFileDialog.Multiselect = true;
            if ((bool)openFileDialog.ShowDialog())
            {
                IsLoading = Visibility.Visible;
                await Task.Delay(3);
                if (openFileDialog.FileNames.Count() == 1)
                {
                    if (App.OpenedFileList.Contains(openFileDialog.FileName))
                    {
                        App.mainWindowViewModel.SelectItem(openFileDialog.FileName);
                    }
                    else
                    {
                        mainContentViewModel.OpenFile(openFileDialog.FileName);
                    }
                    ToolMethod.SetFileThumbImg(openFileDialog.FileName);
                }
                else
                {
                    var fileList = openFileDialog.FileNames.ToList().Where(x => !App.OpenedFileList.Exists(y => y == x)).ToList();
                    if (fileList.Count <= 0)
                        return;

                    mainContentViewModel.OpenFile(fileList[0]);
                    for (int i = 1; i < fileList.Count(); i++)
                    {
                        if (!App.OpenedFileList.Contains(fileList[i]))
                        {
                            //需要加一定延时 不然连续添加多个文件时会出现regionname重名的情况 因为多处导航是异步导航,可能绑定还没更新
                            await Task.Delay(20);
                            App.mainWindowViewModel.AddTabItem(fileList[i]);
                        }
                        ToolMethod.SetFileThumbImg(fileList[i]);
                    }
                }
                IsLoading = Visibility.Collapsed;
            }
        }

        /// <summary>
        /// 创建空白文档
        /// </summary>
        public void CreatBlankPDF()
        {
            mainContentViewModel.CreateFile();
        }

        #region Navigate
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            var mainVM = navigationContext.Parameters[ParameterNames.MainViewModel] as MainContentViewModel;
            if (mainVM != null)
            {
                mainContentViewModel = mainVM;
            }
        }

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

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {

        }
        #endregion
    }
}