using System;
using System.Linq;
using Unity.VisualScripting.AssemblyQualifiedNameParser;

namespace Unity.VisualScripting
{
    public abstract class MemberUnitDescriptor<TMemberUnit> : UnitDescriptor<TMemberUnit> where TMemberUnit : MemberUnit
    {
        protected MemberUnitDescriptor(TMemberUnit unit) : base(unit)
        {
        }

        protected Member member => unit.member;

        protected abstract ActionDirection direction { get; }

        private string Name()
        {
            return unit.member.info.DisplayName(direction);
        }

        protected override string DefinedTitle()
        {
            return Name();
        }

        protected override string ErrorSurtitle(Exception exception)
        {
            if (member?.targetType != null)
            {
                return member.targetType.DisplayName();
            }
            else if (member?.targetTypeName != null)
            {
                try
                {
                    var parsedName = new ParsedAssemblyQualifiedName(member.targetTypeName).TypeName.Split('.').Last();

                    if (BoltCore.Configuration.humanNaming)
                    {
                        return parsedName.Prettify();
                    }
                    else
                    {
                        return parsedName;
                    }
                }
                catch
                {
                    return "Malformed Type Name";
                }
            }
            else
            {
                return "Missing Type";
            }
        }

        protected override string ErrorTitle(Exception exception)
        {
            if (!string.IsNullOrEmpty(member?.name))
            {
                if (BoltCore.Configuration.humanNaming)
                {
                    return member.name.Prettify();
                }
                else
                {
                    return member.name;
                }
            }

            return base.ErrorTitle(exception);
        }

        protected override string DefinedShortTitle()
        {
            return Name();
        }

        protected override EditorTexture DefinedIcon()
        {
            return member.targetType.Icon();
        }

        protected override EditorTexture ErrorIcon(Exception exception)
        {
            if (member.targetType != null)
            {
                return member.targetType.Icon();
            }

            return base.ErrorIcon(exception);
        }

        protected override string DefinedSurtitle()
        {
            return member.targetType.DisplayName();
        }

        protected override string DefinedSummary()
        {
            return member.info.Summary();
        }
    }
}