using MonoFN.Cecil;
using System.Linq;

namespace FishNet.CodeGenerating.Helping.Extension
{

    internal static class CustomAttributeExtensions
    {
        /// <summary>
        /// Finds a field within an attribute.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="customAttr"></param>
        /// <param name="field"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        internal static T GetField<T>(this CustomAttribute customAttr, string field, T defaultValue)
        {
            foreach (CustomAttributeNamedArgument customField in customAttr.Fields)
            {
                if (customField.Name == field)
                {
                    return (T)customField.Argument.Value;
                }
            }

            return defaultValue;
        }

        /// <summary>
        /// Returns if any of the attributes match IAtrribute.
        /// </summary>
        /// <typeparam name="TAttribute"></typeparam>
        /// <param name="attributeProvider"></param>
        /// <returns></returns>
        internal static bool HasCustomAttribute<TAttribute>(this ICustomAttributeProvider attributeProvider)
        {
            return attributeProvider.CustomAttributes.Any(attr => attr.AttributeType.Is<TAttribute>());
        }

        /// <summary>
        /// Returns if ca is of type target.
        /// </summary>
        /// <param name="ca"></param>
        /// <param name="targetFullName"></param>
        /// <returns></returns>
        internal static bool Is(this CustomAttribute ca, string targetFullName)
        {
            return ca.AttributeType.FullName == targetFullName;
        }
    }


}