using bzit.bomg.Models;
using System;
using System.Windows.Forms;
using static RyzStudio.Windows.Forms.BookmarkTreeView;

namespace RyzStudio.Windows.Forms
{
    public class BookmarkTreeViewSNode
    {
        protected BookmarkTreeView Treeview = null;

        public BookmarkTreeViewSNode(BookmarkTreeView treeview)
        {
            Treeview = treeview;
        }

        protected TreeNode SelectedNode
        {
            get => this.Treeview.SelectedNode;
            set => this.Treeview.SelectedNode = value;
        }

        public TreeNode AddFolder() => this.Treeview.AddFolder(this.SelectedNode);

        public TreeNode AddFolder(string name) => this.Treeview.AddFolder(this.SelectedNode, name);

        public TreeNode AddItem(string name, object tag)
        {
            if (this.SelectedNode == null)
            {
                return null;
            }

            if (this.SelectedNode.Tag != null)
            {
                return null;
            }

            TreeNode tn = new TreeNode(name, (int)BookmarkTreeView.IconSet.Default, (int)BookmarkTreeView.IconSet.Default);
            tn.Tag = tag;

            this.SelectedNode.Nodes.Add(tn);

            return tn;
        }

        public void AddOrUpdateItem(BookmarkItemViewModel viewModel)
        {
            switch (this.GetNodeType())
            {
                case NodeType.Root:
                case NodeType.Folder:
                    Treeview.AddItem(this.SelectedNode, viewModel);
                    break;
                case NodeType.Page:
                    Treeview.UpdateItem(this.SelectedNode, viewModel);
                    break;
                default:
                    break;
            }
        }

        public void Delete()
        {
            if (this.SelectedNode == null)
            {
                return;
            }

            if (this.Treeview.Nodes.Count <= 0)
            {
                return;
            }

            if (this.SelectedNode.Equals(this.Treeview.Nodes[0]))
            {
                return;
            }

            this.SelectedNode.Remove();
        }

        public void Edit()
        {
            if (this.SelectedNode == null)
            {
                return;
            }

            if (this.SelectedNode.IsEditing)
            {
                return;
            }

            switch (this.GetNodeType())
            {
                case BookmarkTreeView.NodeType.Root:
                case BookmarkTreeView.NodeType.Folder:
                    this.Treeview.AllowBeginEdit = true;
                    this.SelectedNode.BeginEdit();
                    break;
                case BookmarkTreeView.NodeType.Page:
                    this.Treeview.AllowBeginEdit = true;
                    this.SelectedNode.BeginEdit();
                    break;
                default:
                    break;
            }
        }

        public bool FindTextNode(string term) => this.Treeview.FindTextNode(this.SelectedNode, term);

        public BookmarkTreeView.NodeType GetNodeType() => this.Treeview.GetNodeType(this.SelectedNode);

        public BookmarkItemViewModel GetViewModel() => this.Treeview.GetViewModel(this.SelectedNode);

        public void MoveDown()
        {
            if (this.SelectedNode == null)
            {
                return;
            }

            TreeNode tn = this.SelectedNode;
            if (tn.Parent == null)
            {
                return;
            }

            TreeNode tn1 = tn.Parent;

            if (tn.Index >= (tn1.Nodes.Count - 1))
            {
                return;
            }

            int n = tn.Index + 1;

            tn1.Nodes.Remove(tn);
            tn1.Nodes.Insert(n, tn);

            this.SelectedNode = tn;
        }

        public void MoveUp()
        {
            if (this.SelectedNode == null)
            {
                return;
            }

            TreeNode tn = this.SelectedNode;
            if (tn.Parent == null)
            {
                return;
            }

            if (tn.Index <= 0)
            {
                return;
            }

            int n = tn.Index - 1;

            TreeNode tn1 = tn.Parent;
            tn1.Nodes.Remove(tn);
            tn1.Nodes.Insert(n, tn);

            this.SelectedNode = tn;
        }

        public void Sort()
        {
            if (this.SelectedNode == null)
            {
                return;
            }

            string[] tnv = new string[0];
            TreeNode[] tna = new TreeNode[0];

            foreach (TreeNode tn2 in this.SelectedNode.Nodes)
            {
                Array.Resize(ref tna, (tna.Length + 1));
                tna[(tna.Length - 1)] = tn2;

                Array.Resize(ref tnv, (tnv.Length + 1));
                tnv[(tnv.Length - 1)] = tn2.Text;
            }

            Array.Sort(tnv, tna);

            this.SelectedNode.Nodes.Clear();

            foreach (TreeNode tn2 in tna)
            {
                this.SelectedNode.Nodes.Add(tn2);
            }
        }

    }
}