using ComPDFKit.PDFDocument;
using ComPDFKit.PDFPage;
using ComPDFKit.PDFPage.Edit;
using ComPDFKit.Tool;
using Compdfkit_Tools.Edit;
using Compdfkit_Tools.Helper;
using ComPDFKitViewer;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using System.Windows.Media;

namespace Compdfkit_Tools.PDFControl
{
    public partial class ContentEditControl : UserControl, INotifyPropertyChanged
    {
        #region Property
        public PDFViewControl PdfViewControl = new PDFViewControl();
        public PDFContentEditControl pdfContentEditControl = new PDFContentEditControl();
        private CPDFDisplaySettingsControl displaySettingsControl = null;

        private double[] zoomLevelList = { 1f, 8f, 12f, 25, 33f, 50, 66f, 75, 100, 125, 150, 200, 300, 400, 600, 800, 1000 };

        private TextEditParam pdfTextCreateParam;
        private PDFEditParam lastPDFEditEvent = null;
        private PanelState panelState = PanelState.GetInstance();

        private KeyEventHandler KeyDownHandler;
        public event PropertyChangedEventHandler PropertyChanged;
        public ICommand CloseTabCommand;
        public ICommand ExpandPropertyPanelCommand;

        public bool CanUndo
        {
            get
            {
                try
                {
                    if (PdfViewControl != null && PdfViewControl.PDFViewTool != null)
                    {
                        CPDFViewerTool viewerTool = PdfViewControl.PDFViewTool;
                        CPDFViewer pdfViewer = viewerTool.GetCPDFViewer();
                        return pdfViewer.UndoManager.CanUndo;
                    }
                }
                catch(Exception ex)
                {

                }
                
                return false;
            }
        }

        public bool CanRedo
        {
            get
            {
                try
                {
                    if (PdfViewControl != null && PdfViewControl.PDFViewTool != null)
                    {
                        CPDFViewerTool viewerTool = PdfViewControl.PDFViewTool;
                        CPDFViewer pdfViewer = viewerTool.GetCPDFViewer();
                        return pdfViewer.UndoManager.CanRedo;
                    }
                }
                catch (Exception ex)
                {

                }

                return false;
            }
        }

        private bool CanSave
        {
            get
            {
                try
                {
                    if (PdfViewControl != null && PdfViewControl.PDFViewTool != null)
                    {
                        CPDFViewerTool viewerTool = PdfViewControl.PDFViewTool;
                        CPDFViewer pdfViewer = viewerTool.GetCPDFViewer();
                        return (pdfViewer.UndoManager.CanUndo | pdfViewer.UndoManager.CanRedo);
                    }
                }
                catch (Exception ex)
                {

                }

                return false;
            }
        }

        public event EventHandler<bool> OnCanSaveChanged;
        public event EventHandler OnAnnotEditHandler;

        #endregion

        public ContentEditControl()
        {
            InitializeComponent();
            panelState.PropertyChanged += PanelState_PropertyChanged;
        }
        
        private void PanelState_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == nameof(PanelState.IsLeftPanelExpand))
            {
                ExpandLeftPanel(panelState.IsLeftPanelExpand);
            }
            else if (e.PropertyName == nameof(PanelState.RightPanel))
            {
                if (panelState.RightPanel == PanelState.RightPanelState.PropertyPanel)
                {
                    ExpandRightPropertyPanel(pdfContentEditControl, Visibility.Visible);
                }
                else if (panelState.RightPanel == PanelState.RightPanelState.ViewSettings)
                {
                    ExpandRightPropertyPanel(displaySettingsControl, Visibility.Visible);
                }
                else
                {
                    ExpandRightPropertyPanel(null, Visibility.Collapsed);
                }
            }
        }

        public void ClearPDFEditState(ToggleButton ignoreBtn = null)
        {
            List<ToggleButton> clearBtnList = new List<ToggleButton>()
            {
                PDFTextEditButton,
                PDFImageEditButton
            };

            foreach (ToggleButton item in clearBtnList)
            {
                if (ignoreBtn == item)
                {
                    continue;
                }
                item.IsChecked = false;
            }
        }
         
        private void PDFTextEditButton_Click(object sender, RoutedEventArgs e)
        {
            ToggleButton senderBtn = sender as ToggleButton;
            if (senderBtn != null && PdfViewControl != null)
            {
                ClearPDFEditState(senderBtn);
                //if (senderBtn.IsChecked == true)
                //{
                //    PDFEditEvent createParam = new PDFEditEvent();
                //    createParam.EditType = CPDFEditType.EditText;
                //    createParam.IsBold = false;
                //    createParam.IsItalic = false;
                //    createParam.FontSize = 14;
                //    createParam.FontName = "Helvetica";
                //    createParam.FontColor = Colors.Black;
                //    createParam.TextAlign = TextAlignType.AlignLeft;
                //    createParam.Transparency = 255;

                //    if (PdfViewControl.PDFView != null && PdfViewControl.PDFView.Document != null)
                //    {
                //        CPDFDocument pdfDoc = PdfViewControl.PDFView.Document;
                //        PdfViewControl.PDFView.ToolManager.EnableClickCreate = true;
                //        PdfViewControl.PDFView.ToolManager.ClickCreateWidth = 100;
                //        if (pdfDoc.PageCount > 0)
                //        {
                //            CPDFPage pdfPage = pdfDoc.PageAtIndex(0);
                //            CPDFEditPage editPage = pdfPage.GetEditPage();
                //            editPage.BeginEdit(CPDFEditType.EditText);
                //            createParam.SystemFontNameList.AddRange(editPage.GetFontList());
                //            editPage.EndEdit();
                //        }
                //    }
                  
                //    PdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.EditText);
                //    PdfViewControl.PDFView?.SetPDFEditCreateType(CPDFEditType.EditText);
                //    PdfViewControl.PDFView?.SetMouseMode(MouseModes.PDFEdit);
                //    PdfViewControl.PDFView?.ReloadDocument();

                //    PdfViewControl.PDFView?.SetPDFEditParam(createParam);
                //    pdfContentEditControl.SetPDFTextEditData(createParam);
                //    panelState.RightPanel = PanelState.RightPanelState.PropertyPanel;
                //    pdfTextCreateParam = createParam;
                //}
                //else
                //{
                //    PdfViewControl.PDFView?.SetPDFEditCreateType(CPDFEditType.None);
                //    PdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.EditImage | CPDFEditType.EditText);
                //    PdfViewControl.PDFView?.SetMouseMode(MouseModes.PDFEdit);
                //    PdfViewControl.PDFView?.ReloadDocument();
                //    pdfContentEditControl.ClearContentControl();
                //    panelState.RightPanel = PanelState.RightPanelState.None;
                //}
            }

        }

        private void PDFImageEditButton_Click(object sender, RoutedEventArgs e)
        {
            ToggleButton senderBtn = sender as ToggleButton;
            if (senderBtn != null && PdfViewControl != null)
            {
                panelState.RightPanel = PanelState.RightPanelState.None;
                senderBtn.IsChecked = false;
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "Image Files(*.jpg;*.jpeg;*.png;*.bmp)|*.jpg;*.jpeg;*.png;*.bmp;";
                //if (openFileDialog.ShowDialog() == true)
                //{
                //    ClearPDFEditState(senderBtn);
                //    PdfViewControl.PDFView?.ClearSelectPDFEdit();
                //    PdfViewControl.PDFView?.SetPDFEditType(CPDFEditType.EditImage | CPDFEditType.EditText);
                //    PdfViewControl.PDFView?.SetMouseMode(MouseModes.PDFEdit);
                //    PdfViewControl.PDFView?.ReloadDocument();
                     
                //    PdfViewControl.PDFView?.SetPDFEditCreateType(CPDFEditType.EditImage);
                //    PdfViewControl.PDFView?.AddPDFEditImage(openFileDialog.FileName); 
                //}
            }
        }

        public void ExpandLeftPanel(bool isExpand)
        {
            BotaContainer.Visibility = isExpand ? Visibility.Visible : Visibility.Collapsed;
            Splitter.Visibility = isExpand ? Visibility.Visible : Visibility.Collapsed;
            if (isExpand)
            {
                BodyGrid.ColumnDefinitions[0].Width = new GridLength(320);
                BodyGrid.ColumnDefinitions[1].Width = new GridLength(15);
            }
            else
            {
                BodyGrid.ColumnDefinitions[0].Width = new GridLength(0);
                BodyGrid.ColumnDefinitions[1].Width = new GridLength(0);
            }
        }

        private void UndoBtn_Click(object sender, RoutedEventArgs e)
        {
            if (PdfViewControl != null && PdfViewControl.PDFViewTool != null)
            {
                PdfViewControl.PDFViewTool.GetCPDFViewer()?.UndoManager?.Undo();
                PdfViewControl.PDFViewTool.GetCPDFViewer().UpDataRenderFrame();
            }
        }

        private void RedoBtn_Click(object sender, RoutedEventArgs e)
        {
            if (PdfViewControl != null && PdfViewControl.PDFViewTool != null)
            {
                PdfViewControl.PDFViewTool.GetCPDFViewer()?.UndoManager?.Redo();
                PdfViewControl.PDFViewTool.GetCPDFViewer().UpDataRenderFrame();
            }
        }

        public void SetViewSettings(Visibility visibility, CPDFDisplaySettingsControl displaySettingsControl = null)
        {
            this.PropertyContainer.Child = displaySettingsControl;
            this.PropertyContainer.Visibility = visibility;
        }

        public void SetBOTAContainer(CPDFBOTABarControl botaControl)
        {
            this.BotaContainer.Child = botaControl;
        }

        public void SetDisplaySettingsControl(CPDFDisplaySettingsControl displaySettingsControl)
        {
            this.displaySettingsControl = displaySettingsControl;
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
          
        }

        private void UserControl_UnLoaded(object sender, RoutedEventArgs e)
        {
          
        }
         
        public void ExpandRightPropertyPanel(UIElement propertytPanel, Visibility visible)
        {
            PropertyContainer.Width = 260;
            PropertyContainer.Child = propertytPanel;
            PropertyContainer.Visibility = visible;
        }

        public void InitWithPDFViewer(PDFViewControl view)
        {
            PdfViewControl.PDFViewTool.GetCPDFViewer().UndoManager.PropertyChanged -= UndoManager_PropertyChanged;
            PdfViewControl.PDFViewTool.GetCPDFViewer().UndoManager.PropertyChanged += UndoManager_PropertyChanged;
            PdfViewControl = view;
            PDFGrid.Child = PdfViewControl;
            FloatPageTool.InitWithPDFViewer(view);
            pdfContentEditControl.InitWithPDFViewer(view);
            DataContext = this;
        }


        /// <summary>
        /// Text and Image Selected Event
        /// </summary>
        private void PDFView_PDFEditActiveHandler(object sender, PDFEditParam e)
        {
            lastPDFEditEvent = e; 

            if (e == null)
            {
                PropertyContainer.Child = pdfContentEditControl;

                //if (pdfTextCreateParam != null && PdfViewControl != null && PdfViewControl.PDFView != null)
                //{
                //    if (PdfViewControl.PDFView.GetPDFEditCreateType() == CPDFEditType.EditText)
                //    {
                //        pdfContentEditControl.SetPDFTextEditData(pdfTextCreateParam);
                //    }
                //    else if (PdfViewControl.PDFView.GetPDFEditCreateType() == CPDFEditType.None)
                //    {
                //        pdfContentEditControl.ClearContentControl();
                //    }
                //}
                //else
                //{
                //    pdfContentEditControl.ClearContentControl();
                //}
                return;
            }

            if (e.EditType == CPDFEditType.EditText)
            {
                pdfContentEditControl.SetPDFTextEditData((TextEditParam)e, true);
                return;
            }

            if (e.EditType == CPDFEditType.EditImage && PdfViewControl != null)
            {
                UIElement pageView = sender as UIElement;
                if (pageView != null)
                {
                    pageView.MouseLeftButtonUp += PageView_MouseLeftButtonUp;
                }
                pdfContentEditControl.SetPDFImageEditData((ImageEditParam)e);
                return;
            }
        }

        private void PageView_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            UIElement pageView = sender as UIElement;
            if (pageView != null)
            {
                pageView.MouseLeftButtonUp -= PageView_MouseLeftButtonUp;
            }
            if (lastPDFEditEvent != null && lastPDFEditEvent.EditType == CPDFEditType.EditImage)
            {
                pdfContentEditControl.SetPDFImageEditData((ImageEditParam)lastPDFEditEvent);
            }
        }
        
        public void ClearViewerControl()
        {
            PDFGrid.Child = null;
            BotaContainer.Child = null;
            PropertyContainer.Child = null;
            displaySettingsControl = null;
        }
        
        #region Property changed
        protected void OnPropertyChanged([CallerMemberName] string name = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }


        public void UndoManager_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            OnPropertyChanged(e.PropertyName);
            if (e.PropertyName == "CanSave")
            {
                OnCanSaveChanged?.Invoke(this, CanSave);
            }
        }
        #endregion

        private void CommandBinding_Executed_Undo(object sender, ExecutedRoutedEventArgs e)
        {
            if (PdfViewControl != null && PdfViewControl.PDFViewTool != null && CanUndo)
            {
                PdfViewControl.PDFViewTool.GetCPDFViewer()?.UndoManager?.Undo();
            }
        }

        private void CommandBinding_Executed_Redo(object sender, ExecutedRoutedEventArgs e)
        {
            if (PdfViewControl != null && PdfViewControl.PDFViewTool != null && CanRedo)
            {
                PdfViewControl.PDFViewTool.GetCPDFViewer()?.UndoManager?.Redo();
            }
        }
    }
}
