using System.Collections.Generic;
using System;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using UnityEngine.EventSystems;

[RequireComponent(typeof(UIElementMouseCapturer))]
[RequireComponent(typeof(UIElementDragger))]
[RequireComponent(typeof(Image))]
public class UIWindow : MonoBehaviour
{
    // Window title
    [SerializeField]
    private string windowTitle = "Window";

    // Close button
    private GameObject closeButton;
    [SerializeField]
    private CloseButtonCallback closeButtonCallback;
    [Serializable]
    private enum CloseButtonCallback
    {
        CLOSE_WINDOW,
        TOGGLE_WINDOW
    }

    // IsOpen property
    private bool isOpen;
    private void OnEnable() { isOpen = true; }
    private void OnDisable() { isOpen = false; }

    public void ToggleWindow()
    {
        gameObject.SetActive(!gameObject.activeSelf);
    }

    public void CloseWindow()
    {
        Destroy(gameObject);
        isOpen = false;
    }

    /// <summary>
    /// Called when the UIWindow component is created in the editor
    /// We will use it to configure the image component
    /// </summary>
    private void Reset()
    {
        // 18 16 28 125
        GetComponent<Image>().color = new Color32(18, 16, 28, 125);
    }

    public virtual void Start()
    {
        isOpen = gameObject.activeSelf;
        CreateCloseButton();
        CreateWindowTitle();
        if (closeButtonCallback == CloseButtonCallback.CLOSE_WINDOW)
            closeButton.AddComponent<Button>().onClick.AddListener(CloseWindow);
        else if (closeButtonCallback == CloseButtonCallback.TOGGLE_WINDOW)
            closeButton.AddComponent<Button>().onClick.AddListener(ToggleWindow);
    }

    private void CreateWindowTitle()
    {
        GameObject windowTitleObject = new GameObject("WindowTitle", typeof(RectTransform));
        windowTitleObject.transform.SetParent(transform);
        TextMeshProUGUI windowTitleHandle = windowTitleObject.AddComponent<TextMeshProUGUI>();
        windowTitleHandle.text = windowTitle;
        windowTitleHandle.font = UIManager.Instance.Font;
        windowTitleHandle.fontSize = 14;
        windowTitleHandle.color = Color.white;
        windowTitleHandle.alignment = TextAlignmentOptions.Left;
        windowTitleHandle.rectTransform.anchorMin = new Vector2(0, 1);
        windowTitleHandle.rectTransform.anchorMax = new Vector2(1, 1);
        windowTitleHandle.rectTransform.pivot = new Vector2(0, 1);
        windowTitleHandle.rectTransform.sizeDelta = new Vector2(0, 30);
        windowTitleHandle.rectTransform.anchoredPosition = new Vector2(5, 0);
        windowTitleHandle.rectTransform.SetRight(30); // Give spacing to the close button
    }


    /// <summary>
    /// Create the close [x] button in the top right corner of the window
    /// </summary>
    private void CreateCloseButton()
    {
        closeButton = new GameObject("CloseButton", typeof(RectTransform));
        RectTransform buttonTransform = closeButton.GetComponent<RectTransform>();
        buttonTransform.SetParent(transform);
        // anchor top right 
        buttonTransform.anchorMin = new Vector2(1, 1);
        buttonTransform.anchorMax = new Vector2(1, 1);
        buttonTransform.pivot = new Vector2(1, 1);
        // position top right
        buttonTransform.anchoredPosition = new Vector2(0, 0);
        // size
        buttonTransform.sizeDelta = new Vector2(30, 30);
        // add button component
        TextMeshProUGUI textbox = closeButton.AddComponent<TextMeshProUGUI>();
        textbox.text = "X";
        textbox.font = UIManager.Instance.Font;
        textbox.fontSize = 12;
        textbox.alignment = TextAlignmentOptions.Center;
        textbox.verticalAlignment = VerticalAlignmentOptions.Middle;
    }
}