/*           INFINITY CODE          */
/*     https://infinity-code.com    */

using UnityEditor;
using UnityEngine;

namespace InfinityCode.TreeTools.Editors
{
    public class SelectedTreeToolbar: Toolbar
    {
        private static GUIContent colorContent;
        private static Texture2D colorTexture;
        private static GUIContent deleteContent;
        private static GUIContent duplicateContent;
        private static GUIContent extractContent;
        private static bool inited;
        private static Color lastColor = new Color(0, 0, 0, 0);
        private static GUIContent prototypeContent;

        private static void DeleteTree(TreeItem item)
        {
            TerrainData data = item.terrain.terrainData;
            UndoEx.RecordObject(data, "Delete Tree");
            TreeInstance[] treeInstances = data.treeInstances;
            ArrayUtility.RemoveAt(ref treeInstances, item.index);
            data.treeInstances = treeInstances;
            TreeTool.InitTreeItems();
            TreeTool.SetSelectedIndex(-1);
        }

        public static void Draw(SceneView view, TreeItem item, Vector3 position)
        {
            if (!inited) Init();

            Vector3 viewport = view.camera.WorldToViewportPoint(position);
            if (!Utils.Is01(viewport.x) || !Utils.Is01(viewport.y)) return;
            if (viewport.z < 0) return;

            Handles.BeginGUI();
            float pixelPerPoint = EditorGUIUtility.pixelsPerPoint;
            Vector3 screenPoint = view.camera.WorldToScreenPoint(position) / pixelPerPoint;

            Vector2 size = GetSize();

            if (screenPoint.y > size.y + 150 / pixelPerPoint)
            {
                screenPoint.y -= size.y + 50 / pixelPerPoint;
            }
            else
            {
                screenPoint.y += size.y + 150 / pixelPerPoint;
            }

            screenPoint.x -= size.x / 2;

            screenPoint.y = view.position.height - screenPoint.y;

            Rect rect = new Rect(screenPoint, size);
            if (rect.xMin < 5) rect.x = 5;
            else if (rect.xMax > view.position.width - 5) rect.x = view.position.width - rect.width - 5;

            GUILayout.BeginArea(rect);

            EditorGUILayout.BeginHorizontal();

            DrawColorField(item);

            if (GUILayout.Button(prototypeContent, EditorStyles.toolbarButton, GUILayout.Width(BUTTON_WIDTH)))
            {
                Links.OpenAssetStore();
            }
            if (GUILayout.Button(extractContent, EditorStyles.toolbarButton, GUILayout.Width(BUTTON_WIDTH)))
            {
                Links.OpenAssetStore();
            }

            if (GUILayout.Button(duplicateContent, EditorStyles.toolbarButton, GUILayout.Width(BUTTON_WIDTH))) DuplicateTree(item);
            if (GUILayout.Button(deleteContent, EditorStyles.toolbarButton, GUILayout.Width(BUTTON_WIDTH))) DeleteTree(item);
            DrawHelpSettings();

            EditorGUILayout.EndHorizontal();
            EditorGUILayout.BeginHorizontal();
            
            GUILayout.Label("Tree Tool Demo", EditorStyles.toolbar, GUILayout.Width(rect.width));
            
            EditorGUILayout.EndHorizontal();

            GUILayout.EndArea();

            Handles.EndGUI();
        }

        private static void DrawColorField(TreeItem item)
        {
            if (item.color != lastColor || colorTexture == null)
            {
                if (colorTexture == null) colorTexture = new Texture2D(1, 1);
                colorTexture.SetPixel(0, 0, item.color);
                colorTexture.Apply(false);
                lastColor = item.color;
            }

            Rect r = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.Width(0));
            if (GUILayout.Button(colorContent, EditorStyles.toolbarButton, GUILayout.Width(BUTTON_WIDTH)))
            {
                Links.OpenAssetStore();
            }

            GUI.DrawTexture(new Rect(r.x, r.y + 1, BUTTON_WIDTH - 1, 19), colorTexture, ScaleMode.StretchToFill);
        }

        private static void DuplicateTree(TreeItem item)
        {
            TerrainData data = item.terrainData;
            UndoEx.RecordObject(data, "Duplicate Tree");

            TreeInstance[] treeInstances = data.treeInstances;
            ArrayUtility.Add(ref treeInstances, treeInstances[item.index]);
            data.treeInstances = treeInstances;
            TreeTool.InitTreeItems();
            TreeTool.SetSelectedIndex(treeInstances.Length - 1);
        }

        public static Vector2 GetSize()
        {
            int countButtons = 7;
            if (Updater.hasNewVersion) countButtons++;
            return new Vector2(countButtons * BUTTON_WIDTH, 36);
        }

        private static void Init()
        {
            inited = true;

            InitGeneral();

            prototypeContent = new GUIContent(Icons.prefab, "Prototype\n(Available in full version)");
            extractContent = new GUIContent(Icons.extract, "Extract\n(Available in full version)");
            duplicateContent = new GUIContent(Icons.duplicate, "Duplicate");
            deleteContent = new GUIContent(Icons.trash, "Delete");
            colorContent = new GUIContent(string.Empty, "Color\n(Available in full version)");
        }
    }
}