using UnityEditor;
using System.Collections.Generic;
using Articy.Unity;
using Articy.Unity.Interfaces;
using Articy.Unity.Utils;
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UIElements;

[RequireComponent(typeof(UIDocument))]
public class DialogueBox : MonoBehaviour {
    private UIDocument uiDocument;
    private VisualElement root;
    private Button[] buttons;

    public VisualTreeAsset visualTree;
    public StyleSheet styleSheet;
    public string defaultButtonText = "Continue";

    public void Awake() {
        uiDocument = GetComponent<UIDocument>();
    }

    public void OnEnable() {
        root = uiDocument.rootVisualElement;
        VisualElement tree = visualTree.CloneTree();
        tree.styleSheets.Add(styleSheet);
        root.Add(tree);
        buttons = root.Query<Button>().ToList().ToArray();
        ClearUI();

        for (var i = 0; i < buttons.Length; i++) {
            var index = i;
            buttons[i].RegisterCallback<MouseUpEvent>(_ => GetComponent<ArticyStoryline>().ApplyTransition(index));
        }
    }

    public void ClearUI() {
        SetActor(string.Empty);
        SetText(string.Empty);
        foreach (var button in buttons) {
            button.visible = false; 
        }
    }

    public void SetActor(string actor) {
        root.Q<Label>("Actor").text = actor;
    }

    public void SetText(string text) {
        root.Q<TextElement>("Dialogue").text = text;
    }

    public void SetTransitions(IList<Branch> branches) {
        for (var i = 0; i < buttons.Length; i++) {
            buttons[i].text = string.Empty;        

            if (i < branches.Count) {
                buttons[i].visible = true;

                var menuText = branches[i].Target as IObjectWithMenuText;
                if (menuText != null && menuText.MenuText != string.Empty) {
                    buttons[i].text = menuText.MenuText;
                }
                else {
                    buttons[i].text = defaultButtonText;
                }
            }  
            else {
                buttons[i].visible = false;
            }
        }
    }
}