// 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.Diagnostics;

namespace Microsoft.AspNetCore.Razor.Language
{
    [DebuggerDisplay("{" + nameof(DebuggerToString) + "(),nq}")]
    public sealed class RazorDiagnosticDescriptor : IEquatable<RazorDiagnosticDescriptor>
    {
        private readonly Func<string> _messageFormat;

        public RazorDiagnosticDescriptor(
            string id,
            Func<string> messageFormat,
            RazorDiagnosticSeverity severity)
        {
            if (string.IsNullOrEmpty(id))
            {
                throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmpty, nameof(id));
            }

            if (messageFormat == null)
            {
                throw new ArgumentNullException(nameof(messageFormat));
            }

            Id = id;
            _messageFormat = messageFormat;
            Severity = severity;
        }

        public string Id { get; }

        public RazorDiagnosticSeverity Severity { get; }

        public string GetMessageFormat() => _messageFormat();

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

        public bool Equals(RazorDiagnosticDescriptor other)
        {
            if (other == null)
            {
                return false;
            }

            return string.Equals(Id, other.Id, StringComparison.Ordinal);
        }

        public override int GetHashCode()
        {
            return StringComparer.Ordinal.GetHashCode(Id);
        }

        private string DebuggerToString()
        {
            return $@"Error ""{Id}"": ""{GetMessageFormat()}""";
        }
    }
}
