/* 
    ------------------- 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 System;
using UnityEngine;
using UnityEngine.UI;

namespace CodeMonkey.Utils {

    /*
     * Bar in the UI with scaleable Bar and Background
     * */
    public class UI_Bar {
        
        public GameObject gameObject;
        private RectTransform rectTransform;
        private RectTransform background;
        private RectTransform bar;
        private Vector2 size;
        
        /* 
         * Outline into for Bar
         * */
        public class Outline {
            public float size = 1f;
            public Color color = Color.black;
            public Outline(float size, Color color) {
                this.size = size;
                this.color = color;
            }
        }

        public UI_Bar(GameObject gameObject, RectTransform background, RectTransform bar) {
            this.gameObject = gameObject;
            rectTransform = gameObject.GetComponent<RectTransform>();
            this.background = background;
            this.bar = bar;
            size = background.GetComponent<RectTransform>().sizeDelta;
        }

        public UI_Bar(GameObject gameObject, Transform background, Transform bar) {
            this.gameObject = gameObject;
            rectTransform = gameObject.GetComponent<RectTransform>();
            this.background = background.GetComponent<RectTransform>();
            this.bar = bar.GetComponent<RectTransform>();
            size = background.GetComponent<RectTransform>().sizeDelta;
        }

        public UI_Bar(Transform parent, Vector2 anchoredPosition, Vector2 size, Color barColor, float sizeRatio) {
            SetupParent(parent, anchoredPosition, size);
            SetupBar(barColor);
            SetSize(sizeRatio);
        }

        public UI_Bar(Transform parent, Vector2 anchoredPosition, Vector2 size, Color barColor, float sizeRatio, Outline outline) {
            SetupParent(parent, anchoredPosition, size);
            if (outline != null) SetupOutline(outline, size);
            SetupBar(barColor);
            SetSize(sizeRatio);
        }

        public UI_Bar(Transform parent, Vector2 anchoredPosition, Vector2 size, Color backgroundColor, Color barColor, float sizeRatio) {
            SetupParent(parent, anchoredPosition, size);
            SetupBackground(backgroundColor);
            SetupBar(barColor);
            SetSize(sizeRatio);
        }

        public UI_Bar(Transform parent, Vector2 anchoredPosition, Vector2 size, Color backgroundColor, Color barColor, float sizeRatio, Outline outline) {
            SetupParent(parent, anchoredPosition, size);
            if (outline != null) SetupOutline(outline, size);
            SetupBackground(backgroundColor);
            SetupBar(barColor);
            SetSize(sizeRatio);
        }

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

        private RectTransform SetupOutline(Outline outline, Vector2 size) {
            return UtilsClass.DrawSprite(outline.color, gameObject.transform, Vector2.zero, size + new Vector2(outline.size, outline.size), "Outline");
        }

        private void SetupBackground(Color backgroundColor) {
            background = UtilsClass.DrawSprite(backgroundColor, gameObject.transform, Vector2.zero, Vector2.zero, "Background");
            background.anchorMin = new Vector2(0,0);
            background.anchorMax = new Vector2(1,1);
        }

        private void SetupBar(Color barColor) {
            bar = UtilsClass.DrawSprite(barColor, gameObject.transform, Vector2.zero, Vector2.zero, "Bar");
            bar.anchorMin = new Vector2(0,0);
            bar.anchorMax = new Vector2(0,1f);
            bar.pivot = new Vector2(0,.5f);
        }

        public void SetSize(float sizeRatio) {
            bar.sizeDelta = new Vector2(sizeRatio * size.x, 0f);
        }

        public void SetColor(Color color) {
            bar.GetComponent<Image>().color = color;
        }

        public void SetActive(bool active) {
            gameObject.SetActive(active);
        }

        public Vector2 GetAnchoredPosition() {
            return rectTransform.anchoredPosition;
        }

        public Vector2 GetSize() {
            return rectTransform.sizeDelta;
        }

        public void AddOutline(Outline outline) {
            RectTransform outlineRectTransform = SetupOutline(outline, size);
            outlineRectTransform.transform.SetAsFirstSibling();
        }

        public void SetRaycastTarget(bool set) {
            foreach (Transform trans in gameObject.transform) {
                if (trans.GetComponent<Image>() != null) {
                    trans.GetComponent<Image>().raycastTarget = set;
                }
            }
        }

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

        public Button_UI AddButton() {
            return AddButton(null, null, null);
        }

        public Button_UI AddButton(Action ClickFunc, Action MouseOverOnceFunc, Action MouseOutOnceFunc) {
            Button_UI buttonUI = gameObject.AddComponent<Button_UI>();
            if (ClickFunc != null)
                buttonUI.ClickFunc = ClickFunc;
            if (MouseOverOnceFunc != null)
                buttonUI.MouseOverOnceFunc = MouseOverOnceFunc;
            if (MouseOutOnceFunc != null)
                buttonUI.MouseOutOnceFunc = MouseOutOnceFunc;
            return buttonUI;
        }

    }


}
