using ClaudeDo.Localization;

namespace ClaudeDo.Localization.Tests;

public class EnJsonCoverageTests
{
    private static string LocalesDir()
    {
        var dir = AppContext.BaseDirectory;
        while (dir is not null)
        {
            var candidate = Path.Combine(dir, "src", "ClaudeDo.Localization", "locales");
            if (Directory.Exists(candidate)) return candidate;
            dir = Path.GetDirectoryName(dir);
        }
        throw new DirectoryNotFoundException("Could not locate src/ClaudeDo.Localization/locales");
    }

    [Fact]
    public void Every_locale_has_same_keys_as_english()
    {
        var store = LocaleStore.Load(LocalesDir());
        Assert.True(store.TryGet("en", out var en));
        var enKeys = en!.Strings.Keys.ToHashSet();

        foreach (var locale in store.Available)
        {
            var keys = locale.Strings.Keys.ToHashSet();
            var missing = enKeys.Except(keys).OrderBy(k => k).ToList();
            var extra = keys.Except(enKeys).OrderBy(k => k).ToList();
            Assert.True(missing.Count == 0,
                $"Locale '{locale.Code}' missing keys: {string.Join(", ", missing)}");
            Assert.True(extra.Count == 0,
                $"Locale '{locale.Code}' has extra keys not in en.json: {string.Join(", ", extra)}");
        }
    }
}
