using System;

namespace Unity.VisualScripting
{
    [FuzzyOption(typeof(CreateStruct))]
    public class CreateStructOption : UnitOption<CreateStruct>
    {
        public CreateStructOption() : base() { }

        public CreateStructOption(CreateStruct unit) : base(unit) { }

        public Type structType { get; private set; }

        protected override void FillFromUnit()
        {
            structType = unit.type;
            base.FillFromUnit();
        }

        protected override string Label(bool human)
        {
            if (human)
            {
                return $"Create {structType.HumanName()} ()";
            }
            else
            {
                return $"new {structType.CSharpName()} ()";
            }
        }

        protected override string Haystack(bool human)
        {
            if (human)
            {
                return $"{structType.HumanName()}: Create {structType.HumanName()}";
            }
            else
            {
                return $"new {structType.CSharpName()}";
            }
        }

        public override string SearchResultLabel(string query)
        {
            return base.SearchResultLabel(query) + " ()";
        }

        protected override int Order()
        {
            return 0;
        }

        protected override string FavoriteKey()
        {
            return $"{structType.FullName}@create";
        }

        public override void Deserialize(UnitOptionRow row)
        {
            base.Deserialize(row);

            structType = Codebase.DeserializeType(row.tag1);
        }

        public override UnitOptionRow Serialize()
        {
            var row = base.Serialize();

            row.tag1 = Codebase.SerializeType(structType);

            return row;
        }
    }
}