using System;

namespace Unity.VisualScripting
{
    [Descriptor(typeof(IUnitPort))]
    public sealed class UnitPortDescriptor : IDescriptor
    {
        public UnitPortDescriptor(IUnitPort target)
        {
            Ensure.That(nameof(target)).IsNotNull(target);

            this.target = target;

            description.portType = target;
        }

        public IUnitPort target { get; }

        object IDescriptor.target => target;

        public UnitPortDescription description { get; private set; } = new UnitPortDescription();

        IDescription IDescriptor.description => description;

        public bool isDirty { get; set; } = true;

        public void Validate()
        {
            if (isDirty)
            {
                isDirty = false;

                description.fallbackLabel = target.key.Filter(symbols: false, punctuation: false).Prettify();

                description.portType = target;

                target.unit?.Descriptor<IUnitDescriptor>().DescribePort(target, description);

                // No DescriptionAssignment is run, so we'll just always assume that the description changes.
                DescriptorProvider.instance.TriggerDescriptionChange(target);
            }
        }
    }
}