//============= Copyright (c) Ludic GmbH, All rights reserved. ==============
//
// Purpose: Part of the My Behaviour Tree Controller Code
//
//=============================================================================

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

#if UNITY_EDITOR
using UnityEditor;
[CustomEditor(typeof(NamedEventTrigger))]
public class NamedEventTriggerInspector : ComponentHandlerInspector {
}
#endif

[RequireComponent(typeof(EventTrigger))]
public class NamedEventTrigger : ComponentHandler {
    public override string TypeLabel () {
        return "NamedEventTrigger";
    }

    public override string ContentLabel() {
        UpdateComponent();
        return "";
    }

    public override void UpdateComponent() {
        base.UpdateComponent();

        if (GetComponent<Button>()) {
            GetComponent<Button>().onClick.AddListener(PointerClickEventHandler);
        }
        // if it's not a button, check if it has a collider
        else if (GetComponent<Collider>()) {
            eventTrigger = gameObject.AddComponent<EventTrigger>();
            EventTrigger.Entry entry = new EventTrigger.Entry();
            entry.eventID = EventTriggerType.PointerClick;
            entry.callback.AddListener((eventData) => { PointerClickEventHandler(); });
            eventTrigger.triggers.Add(entry);
        }
        else {
            Debug.LogWarning($"NamedEventTrigger '{gameObject.name}' could not attach click event (missing button or collider)");
        }
    }

    EventTrigger eventTrigger;

    private bool triggered = false;

    public void PointerClickEventHandler () {
        triggered = true;
    }

    public override string titleText {
        get {
            return "Run: Will Succeed on Pointer Click";
        }
    }

    public override string[][] helpText {
        get {
            return new string[][] {
                new string[] {"Run", "Return Success on Press", $"BTC.Run(\"{roomId}\", \"{gameObject.name}\")"},
            };
        }
    }
    
    public override void Run(MyBT.NodeState nodeState) {
        if (nodeState == NodeState.FirstRun) {
            // reset event trigger at start
            triggered = false;
            ToggleActive(true);
        }

        if (nodeState == NodeState.Aborting) {
            triggered = false;
            ToggleActive(false);
        }

        if (triggered) {
            ToggleActive(false);
            Task.SetSucceeded();
            return;
        }
    }

    // public override void Set (MyBT.NodeState nodeState, string key, string value) {
    //     if (nodeState == NodeState.FirstRun) {
    //         if (key == "label") {
    //             UnityEngine.UI.Text textLabel = GetComponentInChildren<UnityEngine.UI.Text>();
    //             if (textLabel != null) {
    //                 textLabel.text = value;
    //                 Task.SetSucceeded();
    //                 return;
    //             }
    //         } else {
    //             Task.SetFailed();
    //             return;
    //         }
    //     }
    //     if (nodeState == NodeState.Running) {
    //     }
    //     if (nodeState == NodeState.Aborting) {
    //     }
    //     Task.SetSucceeded();
    // }

    public void ToggleActive (bool state) {
        if (eventTrigger != null) {
            eventTrigger.enabled = state;
        }
    }
}