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

using System.Collections;
using System.Globalization;
using System.Resources;
using Microsoft.NET.Build.Containers.Resources;

namespace Microsoft.NET.Build.Containers.UnitTests.Resources
{
    public class ResourceTests
    {
        [Fact]
        public void GetString_ReturnsValueFromResources()
        {
            Assert.Equal("CONTAINER0000: Value for unit test {0}", Resource.GetString(nameof(Strings._Test)));
        }

        [Fact]
        public void FormatString_ReturnsValueFromResources()
        {
            Assert.Equal("CONTAINER0000: Value for unit test 1", Resource.FormatString(nameof(Strings._Test), 1));
        }

        [Fact]
        public void EnsureErrorCodeUniqueness()
        {
            ResourceSet? resourceSet = Resource.Manager.GetResourceSet(CultureInfo.InvariantCulture, true, true);
            Assert.NotNull(resourceSet);

            IEnumerable<IGrouping<string, DictionaryEntry>> groups = resourceSet
                .OfType<DictionaryEntry>()
                .Where(e => e.Value is string value && value.StartsWith("CONTAINER", StringComparison.OrdinalIgnoreCase))
                .GroupBy(e => e.Value!.ToString()!.Substring(9, 4))
                .Where(g => g.Count() > 1);

            foreach(IGrouping<string, DictionaryEntry> group in groups)
            {
                if (!group.First().Key!.ToString()!.Contains('_'))
                {
                    Assert.Fail($"Code with number '{group.Key}' is used for multiple resources. You can use single code for multiple messages, but the name of these resources must share same prefix delimited by underscore.");
                }
                else
                {
                    string prefix = group.First().Key!.ToString()!.Split('_')[0];

                    Assert.All(group, e => e.Key!.ToString()!.StartsWith(prefix, StringComparison.Ordinal));
                }
            }
        }
    }
}
