using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using static CommunicationEvents;

public class RenderedScrollFact : FactWrapper, IDropHandler, IPointerClickHandler
{
    #region Serializable
    public TextMeshProUGUI LabelMesh;
    public GameObject ScrollParameterObject;
    #endregion Serializable

    #region Properties
    public int ID
    {
        get => _ID;
        private set
        {
            _ID = value;
            SetLabel(null);
        }
    }
    private int _ID;

    public Scroll Scroll
    {
        get => _Scroll;
        set
        {
            _Scroll = value;
            SetLabel(null);
        }
    }
    private Scroll _Scroll;

    public string ScrollFactURI
        => Scroll.requiredFacts[ID].@ref.uri;

    public string ScrollFactLabel
        => LabelMesh.text;
    #endregion Properties

    protected override void FactUpdated() { }

    public void Populate(Scroll scroll, int Nr)
    {
        Scroll = scroll;
        ID = Nr;
    }

    private void SetLabel(string label)
    {
        LabelMesh.text = label ?? Scroll?.requiredFacts[ID].label ?? "Err";
    }

    private void OnEnable()
    {
        HintAvailableEvent.AddListener(OnHintAvailable);
    }

    private void OnDisable()
    {
        HintAvailableEvent.RemoveListener(OnHintAvailable);
    }

    public void OnClickHintButton()
    {
        ScrollFactHintEvent.Invoke(this.ScrollParameterObject, ScrollFactURI);
    }

    public void OnHintAvailable(List<string> uris)
    {
        GameObject hintButton = ScrollParameterObject.transform.GetChild(2).gameObject;

        hintButton.SetActive(uris.Contains(ScrollFactURI));
    }

    #region DropHandling 

    private FactObject RenderedFactObject;

    public void OnDrop(PointerEventData eventData)
    {
        Fact = eventData.pointerDrag.GetComponent<FactObject>().Fact;

        {
            Debug.Log(Fact.Label + " was dropped on "
                + gameObject.name + " " + (ID + 1) + "/" +
                ScrollDetails.ParameterDisplays.Count + " label: " + ScrollFactLabel);
        }

        Destroy(RenderedFactObject?.gameObject);

        RenderedFactObject = // has to be , Vector3.zero, Quaternion.identity => SetParent
            Instantiate(eventData.pointerDrag, Vector3.zero, Quaternion.identity)
            .GetComponent<FactObject>();

        RenderedFactObject.transform.SetParent(gameObject.transform, worldPositionStays: false);
        RenderedFactObject.Fact = Fact;

        //Set imageToChangeDefaultColor of current: Fix so that current won't take the color
        //the dragged item was having during animation
        RenderedFactObject.GetComponent<ImageHintAnimation>().imageToChangeDefaultColor =
            eventData.pointerDrag.GetComponent<ImageHintAnimation>().imageToChangeDefaultColor;
        RenderedFactObject.GetComponent<ImageHintAnimation>().ResetAnimation();

        var rect = RenderedFactObject.GetComponent<RectTransform>();
        rect.anchorMin = new Vector2(0.5f, 0.5f);
        rect.anchorMax = new Vector2(0.5f, 0.5f);

        Debug.Log("recieved Fact: " + Fact.Id);

        CommunicationEvents.NewAssignmentEvent.Invoke();
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        Destroy(RenderedFactObject);
        Fact = null;

        CommunicationEvents.NewAssignmentEvent.Invoke();
    }

    #endregion DropHandling 
}