using System.Collections.Generic;
using System.Linq;
using UnityEngine;

namespace Unity.VisualScripting
{
    [UnitCategory("Graphs/Graph Nodes")]
    public abstract class GetGraphs<TGraph, TGraphAsset, TMachine> : Unit
        where TGraph : class, IGraph, new()
        where TGraphAsset : Macro<TGraph>
        where TMachine : Machine<TGraph, TGraphAsset>
    {
        /// <summary>
        /// The GameObject to retrieve the graphs from.
        /// </summary>
        [DoNotSerialize]
        [PortLabelHidden]
        [NullMeansSelf]
        public ValueInput gameObject { get; protected set; }

        /// <summary>
        /// The graph that is set on the GameObject.
        /// </summary>
        [DoNotSerialize]
        [PortLabel("Graphs")]
        [PortLabelHidden]
        public ValueOutput graphList { get; protected set; }

        protected override void Definition()
        {
            gameObject = ValueInput<GameObject>(nameof(gameObject), null).NullMeansSelf();
            graphList = ValueOutput(nameof(graphList), Get);
        }

        List<TGraphAsset> Get(Flow flow)
        {
            var go = flow.GetValue<GameObject>(gameObject);
            return go.GetComponents<TMachine>()
                .Where(machine => go.GetComponent<TMachine>().nest.macro != null)
                .Select(machine => machine.nest.macro)
                .ToList();
        }
    }
}