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

namespace Unity.VisualScripting
{
    public static class UnitPortDefinitionUtility
    {
        public static string Label(this IUnitPortDefinition definition)
        {
            return StringUtility.FallbackWhitespace(definition.label, definition.key?.Filter(symbols: false, punctuation: false).Prettify() ?? "?");
        }

        public static IEnumerable<Warning> Warnings(FlowGraph graph, IEnumerable<IUnitPortDefinition> definitions = null)
        {
            if (definitions == null)
            {
                definitions = LinqUtility.Concat<IUnitPortDefinition>(graph.controlInputDefinitions,
                    graph.controlOutputDefinitions,
                    graph.valueInputDefinitions,
                    graph.valueOutputDefinitions);
            }

            var hasDuplicate = definitions.DistinctBy(d => d.key).Count() != definitions.Count();

            if (hasDuplicate)
            {
                yield return Warning.Caution("Some port definitions with non-unique keys are currently ignored.");
            }

            foreach (var definition in definitions)
            {
                if (!definition.isValid)
                {
                    yield return InvalidWarning(definition);
                }
            }
        }

        public static Warning InvalidWarning(IUnitPortDefinition definition)
        {
            if (!StringUtility.IsNullOrWhiteSpace(definition.label))
            {
                return Warning.Caution($"{definition.GetType().HumanName().ToLower().FirstCharacterToUpper()} '{definition.label}' is not properly configured and is currently ignored.");
            }
            else
            {
                return Warning.Caution($"A {definition.GetType().HumanName().ToLower()} with incomplete configuration is currently ignored.");
            }
        }
    }
}