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

public class PiUIManager : MonoBehaviour
{

    [SerializeField] UnityStandardAssets.Characters.FirstPerson.FirstPersonController FPSC;
    public NameMenuPair[] nameMenu;

    private Dictionary<string, PiUI> dict = new Dictionary<string, PiUI>( );

    private void Awake()
    {
       foreach(NameMenuPair pair in nameMenu)
        {
            dict.Add(pair.name, pair.menu);
        }
		transform.localScale = new Vector3(1f / Screen.width, 1f / Screen.height);
		transform.position = Vector2.zero;
    }


    /// <summary>
    /// Will open/close the menu name passed at the position passed.
    /// </summary>
    /// <param name="menuName">Menu to open or close.</param>
    /// <param name="pos">Position to open menu.</param>
    public void ChangeMenuState(string menuName, Vector2 pos = default(Vector2))
    {
        FPSC.enabled = !FPSC.enabled;
        PiUI currentPi = GetPiUIOf(menuName);
        if (currentPi.openedMenu)
        {
            currentPi.CloseMenu( );
        }else
        {
            currentPi.OpenMenu(pos);
        }
    }
   
    /// <summary>
    /// Gets if the passed in piUi is currently opened
    /// </summary>
    /// <param name="piName"></param>
    /// <returns></returns>
    public bool PiOpened(string menuName)
    {
        return GetPiUIOf(menuName).openedMenu;
    }

    /// <summary>
    /// Returns the PiUi for the given menu allowing you to change it as you wish
    /// </summary>
    public PiUI GetPiUIOf(string menuName)
    {

        if (dict.ContainsKey(menuName))
        {
            return dict[menuName];
        }
        else{
            NoMenuOfThatName( );
            return null;
        }
    }

    /// <summary>
    /// After changing the PiUI.sliceCount value and piData data,call this function with the menu name to recreate the menu, at a given position
    /// </summary>
    public void RegeneratePiMenu(string menuName,Vector2 newPos = default(Vector2))
    {
        GetPiUIOf(menuName).GeneratePi(newPos);
    }

    /// <summary>
    /// After changing the PiUI.PiData call this function to update the slices, if sliceCount is changed call RegeneratePiMenu
    /// </summary>
    public void UpdatePiMenu(string menuName)
    {
        GetPiUIOf(menuName).UpdatePiUI( );
    }

    public bool OverAMenu()
    {
        foreach(KeyValuePair<string,PiUI> pi in dict)
        {
            if (pi.Value.overMenu)
            {
                return true;
            }
        }
        return false;
    }



    private void NoMenuOfThatName()
    {
        Debug.LogError("No pi menu with that name, please check the name of which you're calling");
    }

    [System.Serializable]
    public class NameMenuPair
    {
        public string name;
        public PiUI menu;

    }


    //Mods start here
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Tab)){
           
           ChangeMenuState("Normal Menu", new Vector2(Screen.width / 2f, Screen.height / 2f));
           
        }

        if (Input.GetMouseButtonDown(0) && GetPiUIOf("Normal Menu").openedMenu)
        {
            ChangeMenuState("Normal Menu", new Vector2(Screen.width / 2f, Screen.height / 2f));
        }
        

    }

    void Start()
    {
  
        var normalMenu = GetComponentInChildren<PiUI>();
        foreach (PiUI.PiData data in normalMenu.piData)
        {
            
            //Changes slice label
            //Creates a new unity event and adds the testfunction to it
            data.onSlicePressed = new PiUI.SliceEvent();
            data.onSlicePressed.AddListener(TestFunction);


        }
        UpdatePiMenu("Normal Menu");
        //Open or close the menu depending on it's current state at the center of the screne

    }
    private void TestFunction(ToolMode toolMode)
    {
        Debug.Log(toolMode);
        CommunicationEvents.ToolModeChangedEvent.Invoke(toolMode);
    }
}