using System.Reflection;
using FruitBank.Common.SignalRs;

namespace FruitBankHybrid.Shared.Tests
{
    [TestClass]
    public sealed class SignalRTagsTests
    {
        /// <summary>
        /// A <see cref="SignalRTags"/> értékei a drót-protokoll azonosítói: két azonos értékű
        /// konstans (jellemzően copy-paste után) némán másik endpointra irányítaná a hívást.
        /// A kézi számkiosztás szándékos (stabil szerződés), ez a teszt csak alá feszít egy hálót:
        /// kibukik a duplikátumon, és megnevezi a vétkes konstansokat.
        /// </summary>
        /// <remarks>
        /// Csak a <see cref="SignalRTags"/>-ben DEKLARÁLT konstansokat vizsgálja (<c>DeclaredOnly</c>) —
        /// ide ír a fejlesztő kézzel. A framework-ős <c>AcSignalRTags</c>-szal való átfedés
        /// ellenőrzéséhez <c>BindingFlags.FlattenHierarchy</c> kellene.
        /// </remarks>
        [TestMethod]
        public void SignalRTags_HasNoDuplicateValues()
        {
            var tags = typeof(SignalRTags)
                .GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly)
                .Where(f => f.IsLiteral && f.FieldType == typeof(int))
                .Select(f => (f.Name, Value: (int)f.GetRawConstantValue()!))
                .ToList();

            var duplicates = tags
                .GroupBy(t => t.Value)
                .Where(g => g.Count() > 1)
                .Select(g => $"  {g.Key} = {string.Join(", ", g.Select(t => t.Name))}")
                .ToList();

            Assert.AreEqual(0, duplicates.Count, $"Több SignalRTag ugyanazt az értéket kapta:{Environment.NewLine}{string.Join(Environment.NewLine, duplicates)}");
        }
    }
}
