// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

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

namespace Microsoft.AspNetCore.Razor.Language
{
    /// <summary>
    /// A metadata class describing a tag helper attribute.
    /// </summary>
    public abstract class BoundAttributeDescriptor : IEquatable<BoundAttributeDescriptor>
    {
        protected BoundAttributeDescriptor(string kind)
        {
            Kind = kind;
        }

        public string Kind { get; }

        public bool IsIndexerStringProperty { get; protected set; }

        public bool IsIndexerBooleanProperty { get; protected set; }

        public bool IsEnum { get; protected set; }

        public bool IsStringProperty { get; protected set; }

        public bool IsBooleanProperty { get; protected set; }

        internal bool IsEditorRequired { get; set; }

        public string Name { get; protected set; }

        public string IndexerNamePrefix { get; protected set; }

        public string TypeName { get; protected set; }

        public string IndexerTypeName { get; protected set; }

        public bool HasIndexer { get; protected set; }

        public string Documentation { get; protected set; }

        public string DisplayName { get; protected set; }

        public bool CaseSensitive { get; protected set; }

        public IReadOnlyList<RazorDiagnostic> Diagnostics { get; protected set; }

        public IReadOnlyDictionary<string, string> Metadata { get; protected set; }

        public virtual IReadOnlyList<BoundAttributeParameterDescriptor> BoundAttributeParameters { get; protected set; }

        public bool HasErrors
        {
            get
            {
                var errors = Diagnostics.Any(diagnostic => diagnostic.Severity == RazorDiagnosticSeverity.Error);

                return errors;
            }
        }

        public override string ToString()
        {
            return DisplayName ?? base.ToString();
        }

        public bool Equals(BoundAttributeDescriptor other)
        {
            return BoundAttributeDescriptorComparer.Default.Equals(this, other);
        }

        public override bool Equals(object obj)
        {
            return Equals(obj as BoundAttributeDescriptor);
        }

        public override int GetHashCode()
        {
            return BoundAttributeDescriptorComparer.Default.GetHashCode(this);
        }
    }
}
