/* 
    ------------------- Code Monkey -------------------

    Thank you for downloading the Code Monkey Utilities
    I hope you find them useful in your projects
    If you have any questions use the contact form
    Cheers!

               unitycodemonkey.com
    --------------------------------------------------
 */

using UnityEngine;
using UnityEngine.UI;

namespace CodeMonkey.Utils {
    
    /*
     * Displays text with icons in between the text
     * */
    public class UI_TextComplex {
        
        private static Transform GetCanvasTransform() {
            return UtilsClass.GetCanvasTransform();
        }

        public struct Icon {
            public Sprite sprite;
            public Vector2 size;
            public Color color;
            public Icon(Sprite sprite, Vector2 size, Color? color = null) {
                this.sprite = sprite;
                this.size = size;
                if (color == null) {
                    this.color = Color.white;
                } else {
                    this.color = (Color) color;
                }
            }
        }

        public  GameObject gameObject;
        private Transform transform;
        private RectTransform rectTransform;

        // iconChar prepends the iconArr index; 
        // Example using iconChar '#': 
        //      test #0 asdf
        // Displays "test [iconArr[0]] asdf"
        public UI_TextComplex(Transform parent, Vector2 anchoredPosition, int fontSize, char iconChar, string text, Icon[] iconArr, Font font) {
            SetupParent(parent, anchoredPosition);
            string tmp = text;
            float textPosition = 0f;
            while (tmp.IndexOf(iconChar) != -1) {
                string untilTmp = tmp.Substring(0, tmp.IndexOf(iconChar));
                string iconNumber = tmp.Substring(tmp.IndexOf(iconChar)+1);
                int indexOfSpaceAfterIconNumber = iconNumber.IndexOf(" ");
                if (indexOfSpaceAfterIconNumber != -1) {
                    // Still has more space after iconNumber
                    iconNumber = iconNumber.Substring(0, indexOfSpaceAfterIconNumber);
                } else {
                    // No more space after iconNumber
                }
                tmp = tmp.Substring(tmp.IndexOf(iconChar+iconNumber) + (iconChar+iconNumber).Length);
                if (untilTmp.Trim() != "") {
                    Text uiText = UtilsClass.DrawTextUI(untilTmp, transform, new Vector2(textPosition,0), fontSize, font);
                    textPosition += uiText.preferredWidth;
                }
                // Draw Icon
                int iconIndex = UtilsClass.Parse_Int(iconNumber, 0);
                Icon icon = iconArr[iconIndex];
                UtilsClass.DrawSprite(icon.sprite, transform, new Vector2(textPosition + icon.size.x / 2f, 0), icon.size);
                textPosition += icon.size.x;
            }
            if (tmp.Trim() != "") {
                UtilsClass.DrawTextUI(tmp, transform, new Vector2(textPosition,0), fontSize, font);
            }
        }

        private void SetupParent(Transform parent, Vector2 anchoredPosition) {
            gameObject = new GameObject("UI_TextComplex", typeof(RectTransform));
            transform = gameObject.transform;
            rectTransform = gameObject.GetComponent<RectTransform>();
            rectTransform.SetParent(parent, false);
            rectTransform.sizeDelta = new Vector2(0, 0);
            rectTransform.anchorMin = new Vector2(0, .5f);
            rectTransform.anchorMax = new Vector2(0, .5f);
            rectTransform.pivot = new Vector2(0, .5f);
            rectTransform.anchoredPosition = anchoredPosition;
        }

        public void SetTextColor(Color color) {
            foreach (Transform trans in transform) {
                Text text = trans.GetComponent<Text>();
                if (text != null) {
                    text.color = color;
                }
            }
        }

        public float GetTotalWidth() {
            float textPosition = 0f;
            foreach (Transform trans in transform) {
                Text text = trans.GetComponent<Text>();
                if (text != null) {
                    textPosition += text.preferredWidth;
                }
                Image image = trans.GetComponent<Image>();
                if (image != null) {
                    textPosition += image.GetComponent<RectTransform>().sizeDelta.x;
                }
            }
            return textPosition;
        }

        public float GetTotalHeight() {
            foreach (Transform trans in transform) {
                Text text = trans.GetComponent<Text>();
                if (text != null) {
                    return text.preferredHeight;
                }
            }
            return 0f;
        }

        public void AddTextOutline(Color color, float size) {
            foreach (Transform textComplexTrans in transform) {
                if (textComplexTrans.GetComponent<Text>() != null) {
                    Outline outline = textComplexTrans.gameObject.AddComponent<Outline>();
                    outline.effectColor = color;
                    outline.effectDistance = new Vector2(size, size);
                }
            }
        }

        public void SetAnchorMiddle() {
            rectTransform.anchorMin = new Vector2(.5f, .5f);
            rectTransform.anchorMax = new Vector2(.5f, .5f);
        }

        public void CenterOnPosition(Vector2 position) {
            rectTransform.anchoredPosition = position + new Vector2(-GetTotalWidth() / 2f, 0);
        }

        public void DestroySelf() {
            Object.Destroy(gameObject);
        }

    }

}
