using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

[RequireComponent(typeof(FactWrapper))]
public class FactFavorisation : MonoBehaviour, IPointerClickHandler
{
    #region InspectorVariables
    [Header("Prefabs")]
    [SerializeField] private GameObject favoriteDisplayPrefab;
    #endregion InspectorVariables

    #region Static Variables
    private static readonly UnityEvent<Fact, bool> ChangeFavoriteEvent = new();
    private static readonly List<Fact> favorites = new();
    #endregion Static Variables

    #region Variables
    private GameObject favoriteDisplay;
    private Fact fact;
    #endregion Variables

    #region Properties
    private bool isFavorite = false;
    public bool IsFavorite
    {
        get { return isFavorite; }
        set { ChangeFavoriteEvent.Invoke(fact, value); }
    }
    #endregion Properties

    #region UnityMethods
    public void OnPointerClick(PointerEventData eventData)
    {
        // TODO: add support for other input systems
        if (eventData.button == PointerEventData.InputButton.Middle)
        {
            // write to property to invoke event
            IsFavorite = !IsFavorite;

            // update favorites list
            if (isFavorite)
                favorites.Add(fact);
            else
                favorites.Remove(fact);
        }
    }

    private void Start()
    {
        fact = transform.GetComponent<FactWrapper>().fact;
        ChangeFavoriteEvent.AddListener(OnFavoriteChange);

        // check if fact is currenty a favorite
        if (favorites.Contains(fact))
        {
            isFavorite = true;
            UpdateDisplay();
        }  
    }
    #endregion UnityMethods

    #region Implementation
    private void OnFavoriteChange(Fact changedFact, bool isFavourite)
    {
        if (fact == changedFact)
        {
            this.isFavorite = isFavourite;
            UpdateDisplay();
        }
    }

    private void UpdateDisplay()
    {
        if (!isFavorite)
            Destroy(favoriteDisplay);
        else
            if (!favoriteDisplay)
                favoriteDisplay = Instantiate(favoriteDisplayPrefab, transform);
    }
    #endregion Implementation
}