using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

namespace GamePhone {
    [RequireComponent(typeof(SpriteRenderer))]
    [RequireComponent(typeof(BoxCollider2D))]
    public class Button : Division {

        public Sprite normalSprite;
        public Sprite activeSprite;

        public UnityEvent OnClick;
        public UnityEvent OnHold;

        private SpriteRenderer spriteRenderer;
        private bool triggered;

        // Called on initialisation
        protected virtual void Awake() {
            if (OnClick == null) {
                OnClick = new UnityEvent ();
            }
            if (OnHold == null) {
                OnHold = new UnityEvent ();
            }
            spriteRenderer = GetComponent<SpriteRenderer>();
            Reset();
        }

        // Resets the button size so that it is the same as the sprite
        public void Reset() {
            if (normalSprite) {
                spriteRenderer.sprite = normalSprite;
                bounds.size = normalSprite.bounds.size;
                bounds.center = normalSprite.bounds.center;
            }
            GetComponent<BoxCollider2D> ().size = bounds.size;
        }

        // Gets called when the user touches this division
        public override void OnMouseSelect () {
            if (activeSprite) {
                spriteRenderer.sprite = activeSprite;
            }
            base.OnMouseSelect();
        }

        // Gets called when the user resleases this division
        public override void OnMouseRelease () {
            if (normalSprite) {
                spriteRenderer.sprite = normalSprite;
            }
            triggered = false;
            base.OnMouseRelease ();
        }

        // Gets called when the user clicks on this division
        public override void OnMouseClick ()
        {
            OnClick.Invoke ();
            base.OnMouseClick ();
        }

        // Gets called every frame (after the treshold) that the user holds this division
        public override void OnMouseHold ()
        {
            if (!triggered) {
                OnHold.Invoke ();
                triggered = true;
            }
            base.OnMouseHold ();
        }

        // Used to safely resize a button
        public override void Resize(float width, float height) {
            Reset();
            float scale = Mathf.Min(width / (float)bounds.size.x, height / (float)bounds.size.y);
            bounds.size = scale * bounds.size;
        }
    }
}