using ComPDFKit.PDFDocument;
using PDF_Office.Helper;
using PDF_Office.Model.BOTA;
using PDF_Office.ViewModels.BOTA;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace PDF_Office.Views.BOTA
{
    /// <summary>
    /// OutLineControl.xaml 的交互逻辑
    /// </summary>
    public partial class OutLineControl : UserControl
    {
        /// <summary>
        /// 当前显示了线段的Item
        /// </summary>
        private TreeViewItem Treeviewitem = null;
        /// <summary>
        /// 需要重命名的Item的DataContext
        /// </summary>
        private OutlineNode ReNameOutlineNode = null;
        public OutLineControl()
        {
            InitializeComponent();
        }

        private void BtnMore_Click(object sender, RoutedEventArgs e)
        {
            MenuMore.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;
            MenuMore.PlacementTarget = BtnMore;
            MenuMore.IsOpen = true;
        }
        private void OutlineView_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                var pos = e.GetPosition(OutlineView);
                HitTestResult result = VisualTreeHelper.HitTest(OutlineView, pos);
                if (result == null)
                {
                    return;
                }
                var treeViewItem = CommonHelper.FindVisualParent<TreeViewItem>(result.VisualHit);
                if (treeViewItem == null)
                {
                    return;
                }
                DataObject dataObj = new DataObject(treeViewItem);
                DragDrop.DoDragDrop(OutlineView, dataObj, DragDropEffects.Move);
                return;
            }
        }

        /// <summary>
        /// 拖拽判断区域以及显示什么线
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Grid_DragOver(object sender, DragEventArgs e)
        {
            TreeViewItem sourceitem = e.Data.GetData(typeof(TreeViewItem)) as TreeViewItem;
            if (sourceitem == null)
            {
                return;
            }
            Point pos = e.GetPosition(OutlineView);
            HitTestResult result = VisualTreeHelper.HitTest(OutlineView, pos);
            if (result != null)
            {
                TreeViewItem treeviewitem = CommonHelper.FindVisualParent<TreeViewItem>(result.VisualHit);
                if (treeviewitem != null)
                {
                    //控制最顶端的线
                    if (pos.Y <= 9)
                    {
                        if (Treeviewitem == null)
                        {
                            Treeviewitem = treeviewitem;
                        }
                        (DataContext as OutLineControlViewModel).IsInsertHead = true;
                        (Treeviewitem.DataContext as OutlineNode).IsInsertCurrentLayer = false;
                        (Treeviewitem.DataContext as OutlineNode).IsInsertNextLayer = false;
                    }
                    else
                    {
                        (DataContext as OutLineControlViewModel).IsInsertHead = false;

                        if (Treeviewitem == null)
                        {
                            Treeviewitem = treeviewitem;
                        }
                        else if (!Treeviewitem.Equals(treeviewitem))
                        {
                            (Treeviewitem.DataContext as OutlineNode).IsInsertCurrentLayer = false;
                            (Treeviewitem.DataContext as OutlineNode).IsInsertNextLayer = false;
                            Treeviewitem = treeviewitem;
                        }
                        else
                        {
                            (Treeviewitem.DataContext as OutlineNode).IsInsertCurrentLayer = false;
                            (Treeviewitem.DataContext as OutlineNode).IsInsertNextLayer = false;
                        }
                        if (Treeviewitem.Equals(sourceitem))
                        {
                            return;
                        }

                        //鼠标位于上半部分显示实线,下半部分显示虚线
                        Point p = treeviewitem.TranslatePoint(new Point(0, 0), OutlineView);
                        if (pos.Y < p.Y + 16)
                        {
                            (treeviewitem.DataContext as OutlineNode).IsInsertCurrentLayer = true;
                        }
                        else
                        {
                            (treeviewitem.DataContext as OutlineNode).IsInsertNextLayer = true;
                        }
                    }
                }
            }
        }

        private void Grid_DragLeave(object sender, DragEventArgs e)
        {
            HiddenaAllLine();
        }

        private void OutlineView_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            TextBlock text = e.OriginalSource as TextBlock;
            if (text == null || text.Name == "PageIndex")
            {
                return;
            }
            TreeView tree = sender as TreeView;
            if (tree == null)
            {
                return;
            }
            OutlineNode viewitem = tree.SelectedItem as OutlineNode;
            if (viewitem == null)
            {
                return;
            }
            ReNameOutlineNode = viewitem;
            text.Visibility = Visibility.Collapsed;
            e.Handled = true;
        }

        private void OutlineView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {

        }

        private void OutlineView_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            (DataContext as OutLineControlViewModel).IsInsertHead = false;
            if (Treeviewitem != null)
            {
                (Treeviewitem.DataContext as OutlineNode).IsInsertCurrentLayer = false;
                (Treeviewitem.DataContext as OutlineNode).IsInsertNextLayer = false;
                Treeviewitem = null;
            }
        }

        private void OutlineView_Drop(object sender, DragEventArgs e)
        {
            TreeViewItem souredata = e.Data.GetData(typeof(TreeViewItem)) as TreeViewItem;
            OutlineNode soureoutlineNode = souredata.DataContext as OutlineNode;
            Point pos = e.GetPosition(OutlineView);
            HitTestResult result = VisualTreeHelper.HitTest(OutlineView, pos);
            if (result==null)
            {
                HiddenaAllLine();
                return;
            }
            TreeViewItem targetitem = CommonHelper.FindVisualParent<TreeViewItem>(result.VisualHit);
            if (targetitem==null)
            {
                HiddenaAllLine();
                return;
            }
            OutlineNode targetoutlineNode = targetitem.DataContext as OutlineNode;
            if (soureoutlineNode.Equals(targetoutlineNode))
            {
                HiddenaAllLine();
                return;
            }
           (DataContext as OutLineControlViewModel).InsertOutLine(targetoutlineNode, soureoutlineNode);

            HiddenaAllLine();
            (DataContext as OutLineControlViewModel).Updata(true);
        }

        private void HiddenaAllLine()
        {
            (DataContext as OutLineControlViewModel).IsInsertHead = false;
            if (Treeviewitem != null)
            {
                (Treeviewitem.DataContext as OutlineNode).IsInsertCurrentLayer = false;
                (Treeviewitem.DataContext as OutlineNode).IsInsertNextLayer = false;
                Treeviewitem = null;
            }
        }

        private void ReName_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            TextBox ReNameText = sender as TextBox;
            if (ReNameText == null)
            {
                return;
            }
            if (ReNameText.Visibility == Visibility.Visible)
            {
                if (ReNameOutlineNode != null)
                {
                    ReNameText.Text = ReNameOutlineNode.Outline.Title;
                }
                ReNameText.Focus();
                ReNameText.SelectAll();
            }
        }

        private void RenameGrid_LostFocus(object sender, RoutedEventArgs e)
        {
            TextBox newdto = e.OriginalSource as TextBox;
            if (newdto == null)
            {
                return;
            }
            string newtitle = string.IsNullOrEmpty(newdto.Text) ? "" : newdto.Text;
            Grid senderdto = sender as Grid;
            if (senderdto == null)
            {
                return;
            }
            senderdto.Visibility = Visibility.Collapsed;
            if (ReNameOutlineNode != null)
            {
                CPDFOutline result = ReNameOutlineNode.Outline;
                if (result != null)
                {
                    if (newtitle == result.Title)
                    {
                        return;
                    }
                    (DataContext as OutLineControlViewModel).SetTitle(result, newtitle);
                }
                (DataContext as OutLineControlViewModel).Updata(false);
            }
        }
    }
}