using ComDocumentAIKit;
using ComPDFKitViewer.PdfViewer;
using PDF_Office.CustomControl;
using PDF_Office.Helper;
using PDF_Office.Model;
using PDF_Office.Model.Dialog.ConverterDialogs;
using PDF_Office.Model.Dialog.HomePageToolsDialogs.HomePageBatchProcessing;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using DialogResult = Prism.Services.Dialogs.DialogResult;

namespace PDF_Office.ViewModels.Dialog.ConverterDialogs
{
    public class ConverterPPTDialogViewModel : BindableBase, IDialogAware
    {

        public string Title => "";

        public event Action<IDialogResult> RequestClose;

        #region 参数和属性
        public ConverterPPTDialogModel ConverterPPTModel = new ConverterPPTDialogModel();

        public CPDFViewer currentViewer;

        public IDialogService dialogs;

        public string CurrentPageIndex = "1";

        public string PageRangeText { set; get; } = "0";

        public string PageRangeSelectIndex { set; get; } = "0";

        private int maxPageRange = 0;
        public int MaxPageRange
        {
            get { return maxPageRange; }
            set
            {
                SetProperty(ref maxPageRange, value);
            }
        }

        private bool oCRCheckBoxIsCheckBox = true;
        public bool OCRCheckBoxIsCheckBox
        {
            get { return oCRCheckBoxIsCheckBox; }
            set
            {
                SetProperty(ref oCRCheckBoxIsCheckBox, value);
                ConverterPPTModel.Options.IsAllowOCR = oCRCheckBoxIsCheckBox;
            }
        }

        private int languageSelectedIndex = 2;
        public int LanguageSelectedIndex
        {
            get { return languageSelectedIndex; }
            set
            {
                SetProperty(ref languageSelectedIndex, value);
                SelectLanguage(languageSelectedIndex);

            }
        }
        #endregion

        #region 委托声明

        public DelegateCommand CancelCommand { get; set; }

        public DelegateCommand ConverterCommnad { get; set; }

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

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

        public DelegateCommand BatchConverterCommand { get; set; }
        #endregion

        public ConverterPPTDialogViewModel(IDialogService dialogService)
        {
            CancelCommand = new DelegateCommand(cancel);
            ConverterCommnad = new DelegateCommand(converter);
            CmbPageSelectionChanged = new DelegateCommand<object>(CmbPageSelectionChangedEvent);
            CmbPageTextChanged = new DelegateCommand<object>(CmbPageTextChangedEvent);
            BatchConverterCommand = new DelegateCommand(BatchConverter);
            dialogs = dialogService;
        }
        #region 逻辑函数
        private void cancel()
        {
            RequestClose.Invoke(new DialogResult(ButtonResult.Cancel));
        }

        private void converter()
        {
            System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog();
            /*
             *设置这个对话框的起始保存路径
             */
            sfd.InitialDirectory = currentViewer.Document.FilePath;
            /*
             *设置保存的文件的类型,注意过滤器的语法 例子:“文件类型|*.后缀名;*.后缀名;”
             */
            sfd.Filter = "PDF|*.pptx;";
            /*
             *调用ShowDialog()方法显示该对话框,该方法的返回值代表用户是否点击了确定按钮
             */
            sfd.FileName = currentViewer.Document.FileName + ".pptx";
            /*
             * 做一些工作
             */
            if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                ConverterPPTModel.OutputPath = sfd.FileName;
                try { if (File.Exists(ConverterPPTModel.OutputPath)) File.Delete(ConverterPPTModel.OutputPath); }
                catch
                {
                    AlertsMessage alertsMessage = new AlertsMessage();
                    alertsMessage.ShowDialog("文件已被占用", "请重新选则目标路径", "确定");
                    return;
                }

            }
            else
            {
                return;
            }
            HomePageEditHelper.GetPagerange(PageRangeSelectIndex, currentViewer, ref ConverterPPTModel.PageRange, PageRangeText, true, CurrentPageIndex);
            if (ConverterPPTModel.PageRange == "")
            {
                Trace.WriteLine("输入不对");
                MessageBoxEx.Show("输入不对");
                return;
            }
            char[] enumerationSeparator = new char[] { ',' };
            char[] rangeSeparator = new char[] { '-' };
            if (!CommonHelper.GetPagesInRange(ref ConverterPPTModel.PageIndexLists, ConverterPPTModel.PageRange, currentViewer.Document.PageCount, enumerationSeparator, rangeSeparator))
            { //TODO

                Trace.WriteLine("输入不对");
                MessageBoxEx.Show("输入不对");
                return;
            }
            ConverterPPTModel.pPTOptions = ConverterPPTModel.PPTOptions();
            //DialogParameters value = new DialogParameters();
            //value.Add(ParameterNames.ConverterType, "PPT");
            //value.Add(ParameterNames.ConverterTypeModel, ConverterPPTModel);
            var dialogresult = new DialogResult(ButtonResult.OK);
            dialogresult.Parameters.Add(ParameterNames.ConverterType, "PPT");
            dialogresult.Parameters.Add(ParameterNames.ConverterTypeModel, ConverterPPTModel);
            RequestClose.Invoke(dialogresult);
            //RequestClose?.Invoke(new DialogResult(ButtonResult.OK));
            //dialogs.ShowDialog(DialogNames.ConverterProgressBarDialog, value, e =>
            //{

            //});
        }

        private void CmbPageSelectionChangedEvent(object e)
        {
            ///这里采用的是将预览UI控件传递过来的方式,为下下策
            ///正确的方式应该是 通过声明一些属性,再通过绑定来更新预览控件对应值的形式
            ///但是目前发现自定义控件的依赖属性绑定有些问题,因此先用此方法,将业务逻辑代码先调整到VM里
            var ConverterPreview = e as PageTurningPreview;
            if (ConverterPreview != null)
            {
                string PageRangeSelectIndex = this.PageRangeSelectIndex;
                var currentViewer = this.currentViewer;
                string PageRange = "";
                var PageRangeText = this.PageRangeText;
                if (PageRangeSelectIndex == "0" || PageRangeSelectIndex == "2" || PageRangeSelectIndex == "3")
                {
                    HomePageEditHelper.GetPagerange(PageRangeSelectIndex, currentViewer, ref PageRange, PageRangeText, true);
                    char[] enumerationSeparator = new char[] { ',' };
                    char[] rangeSeparator = new char[] { '-' };
                    if (!CommonHelper.GetPagesInRange(ref ConverterPreview.PageIndexLists, PageRange, currentViewer.Document.PageCount, enumerationSeparator, rangeSeparator))
                    { //TODO
                        ConverterPreview.PageIndexLists.Add(0);
                        Trace.WriteLine("输入不对");
                        MessageBoxEx.Show("输入不对");
                        return;
                    }

                }
                if (PageRangeSelectIndex == "1")
                {
                    char[] enumerationSeparator = new char[] { ',' };
                    char[] rangeSeparator = new char[] { '-' };
                    if (!CommonHelper.GetPagesInRange(ref ConverterPreview.PageIndexLists, (currentViewer.CurrentIndex + 1).ToString()
, currentViewer.Document.PageCount, enumerationSeparator, rangeSeparator))
                    { //TODO

                        Trace.WriteLine("输入不对");
                        MessageBoxEx.Show("输入不对");
                        return;
                    }
                    this.CurrentPageIndex = (ConverterPreview.PageIndexLists.Last<int>() + 1).ToString();
                }
                ConverterPreview.PageIndex.Text = (ConverterPreview.PageIndexLists.Last<int>() + 1).ToString();
                ConverterPreview.CurrentIndex = 0;
            }
        }

        private void CmbPageTextChangedEvent(object e)
        {
            var ConverterPreview = e as PageTurningPreview;
            if (ConverterPreview != null)
            {
                if (ConverterPreview != null)
                {
                    string PageRangeSelectIndex = this.PageRangeSelectIndex;
                    var currentViewer = this.currentViewer;
                    string PageRange = "";
                    var PageRangeText = this.PageRangeText;
                    HomePageEditHelper.GetPagerange(PageRangeSelectIndex, currentViewer, ref PageRange, PageRangeText, true);
                    char[] enumerationSeparator = new char[] { ',' };
                    char[] rangeSeparator = new char[] { '-' };

                    if (!CommonHelper.GetPagesInRange(ref ConverterPreview.PageIndexLists, PageRange, currentViewer.Document.PageCount, enumerationSeparator, rangeSeparator))
                    { //TODO
                        ConverterPreview.PageIndexLists.Add(0);

                        return;
                    }
                    else
                    {
                        ConverterPreview.PageIndex.Text = (ConverterPreview.PageIndexLists.Last<int>() + 1).ToString();
                        ConverterPreview.CurrentIndex = 0;
                    }
                }
            }
        }

        private void BatchConverter()
        {

            DialogParameters convertpdftoword = new DialogParameters();
            convertpdftoword.Add(ParameterNames.BatchProcessing_Name, "0");
            convertpdftoword.Add("ConverterTypeIndex", 2);
            HomePageBatchProcessingDialogModel.FilePaths = new List<string> { currentViewer.Document.FilePath.ToString() };
            HomePageBatchProcessingDialogModel.BatchProcessingIndex = 1;
            convertpdftoword.Add(ParameterNames.FilePath, new string[] { currentViewer.Document.FilePath.ToString() });
            dialogs.ShowDialog(DialogNames.HomePageBatchProcessingDialog, convertpdftoword, e => { });
        }

        private void SelectLanguage(int SelectedIndex)
        {

            switch (SelectedIndex)
            {
                case 0:
                    ConverterPPTModel.Options.OCRLanguage = COCRLanguage.Chinese;
                    break;
                case 1:
                    ConverterPPTModel.Options.OCRLanguage = COCRLanguage.ChineseTraditional;
                    break;
                case 2:
                    ConverterPPTModel.Options.OCRLanguage = COCRLanguage.English;
                    break;
                case 3:
                    ConverterPPTModel.Options.OCRLanguage = COCRLanguage.Japanese;
                    break;
                case 4:
                    ConverterPPTModel.Options.OCRLanguage = COCRLanguage.Korean;
                    break;
                default:
                    break;
            }
        }
        #endregion

        #region 构架行为

        public bool CanCloseDialog()
        {
            return true;
        }

        public void OnDialogClosed()
        {
        }

        public void OnDialogOpened(IDialogParameters parameters)
        {
            CPDFViewer pdfViewer = null;
            parameters.TryGetValue<CPDFViewer>(ParameterNames.PDFViewer, out pdfViewer);
            if (pdfViewer != null)
            {
                currentViewer = pdfViewer;
                MaxPageRange = currentViewer.Document.PageCount;
                if (currentViewer.Tag != null) { ConverterPPTModel.Pawssword = currentViewer.Tag.ToString(); }
                ConverterPPTModel.InputPath = pdfViewer.Document.FilePath;
                FileInfo fileinfo = new FileInfo(ConverterPPTModel.InputPath);
                ConverterPPTModel.OutputPath = fileinfo.DirectoryName;
            }
        }
        #endregion
    }
}