using System.Text.Json;
using PlanTempus.Application.Features.Localization.Models;

namespace PlanTempus.Application.Features.Localization.Services;

public class JsonLocalizationService : ILocalizationService
{
    private readonly string _translationsPath;
    private readonly Dictionary<string, JsonDocument> _cache = new();

    public JsonLocalizationService(IWebHostEnvironment env)
    {
        _translationsPath = Path.Combine(env.ContentRootPath, "Features", "Localization", "Translations");
    }

    public string CurrentCulture => "da";

    public string Get(string key, string? culture = null)
    {
        culture ??= CurrentCulture;
        var doc = GetDocument(culture);

        if (doc == null)
            return key;

        var parts = key.Split('.');
        JsonElement current = doc.RootElement;

        foreach (var part in parts)
            if (!current.TryGetProperty(part, out current))
                return key;

        return current.GetString() ?? key;
    }

    private JsonDocument? GetDocument(string culture)
    {
        if (_cache.TryGetValue(culture, out var cached))
            return cached;

        var filePath = Path.Combine(_translationsPath, $"{culture}.json");

        if (!File.Exists(filePath))
            return null;

        var json = File.ReadAllText(filePath);
        var doc = JsonDocument.Parse(json);
        _cache[culture] = doc;

        return doc;
    }

    public IEnumerable<SupportedCulture> GetSupportedCultures()
    {
        return new List<SupportedCulture>
        {
            new() { Code = "da", Name = "Danish", NativeName = "Dansk" },
            new() { Code = "en", Name = "English", NativeName = "English" }
        };
    }
}
