using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SharpCompress.Common;

namespace IRaCIS.Core.Application.Helper;


public class IRCGlobalInfoDTO
{
    public string Code { get; set; }

    public string Value { get; set; }

    public string ValueCN { get; set; }

    public string Description { get; set; }
}

public static class InternationalizationHelper
{
    public static string JsonFileFolder = Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources);

    public static string USJsonPath = Path.Combine(JsonFileFolder, StaticData.En_US_Json);
    public static string CNJsonPath = Path.Combine(JsonFileFolder, StaticData.Zh_CN_Json);

    static InternationalizationHelper()
    {
        if (!Directory.Exists(JsonFileFolder) ||
          !Directory.GetFiles(JsonFileFolder).Any(filePath => Path.GetExtension(filePath).Equals(".json", StringComparison.OrdinalIgnoreCase)) ||
          !File.Exists(USJsonPath) || !File.Exists(CNJsonPath))
        {
            throw new BusinessValidationFailedException(I18n.T("IRaCISCHangfireJob_FileNotFound"));
        }
    }



    public static async Task BatchAddJsonKeyValueAsync(List<IRCGlobalInfoDTO> list)
    {
        await StoreInfoToFileAsync(list);
    }

    public static async Task AddOrUpdateJsonKeyValueAsync(IRCGlobalInfoDTO info)
    {
        var list = new List<IRCGlobalInfoDTO>() { info };

        await StoreInfoToFileAsync(list);

    }


    public static async Task StoreInfoToFileAsync(List<IRCGlobalInfoDTO> list)
    {
        foreach (var filePath in new string[] { USJsonPath, CNJsonPath })
        {
            var json = await File.ReadAllTextAsync(filePath);

            JObject jsonObject = JObject.Parse(json, new JsonLoadSettings() { CommentHandling = CommentHandling.Load });

            if (filePath.Contains(StaticData.En_US_Json))
            {
                foreach (var tojsonItem in list)
                {
                    jsonObject[tojsonItem.Code] = tojsonItem.Value;

                    //日志记录该信息方便自己人看, 返回给客户的是配置的
                    StaticData.Localizer_Dev_Dic[tojsonItem.Code] = tojsonItem.Description;
                }
            }
            else
            {
                foreach (var tojsonItem in list)
                {
                    jsonObject[tojsonItem.Code] = tojsonItem.ValueCN;

                }
            }

            await File.WriteAllTextAsync(filePath, jsonObject.ToString());
        }
    }



    #region 监测Json文件变更 实时刷新数据  废弃
    //FileSystemWatcher_US = new FileSystemWatcher
    //{
    //    Path = Path.GetDirectoryName(USJsonPath)!,
    //    NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Size,
    //    Filter = Path.GetFileName(USJsonPath),
    //    EnableRaisingEvents = true,

    //};
    //// 添加文件更改事件的处理程序
    //FileSystemWatcher_US.Changed += (sender, e) => LoadJsonFile(StaticData.Folder.Resources + "\\" + StaticData.En_US_Json);


    //FileSystemWatcher_CN = new FileSystemWatcher
    //{
    //    Path = Path.GetDirectoryName(CNJsonPath)!,
    //    NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Size,
    //    Filter = Path.GetFileName(CNJsonPath),
    //    EnableRaisingEvents = true,

    //};
    //FileSystemWatcher_CN.Changed += (sender, e) => LoadJsonFile(StaticData.Folder.Resources + "\\" + StaticData.Zh_CN_Json);


    //private static void LoadJsonFile(string filePath)
    //{
    //    Console.WriteLine("刷新json内存数据");
    //    IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile(filePath, false, false);

    //    IConfigurationRoot enConfiguration = builder.Build();

    //    foreach (IConfigurationSection section in enConfiguration.GetChildren())
    //    {
    //        if (filePath.Contains(StaticData.En_US_Json))
    //        {
    //            StaticData.En_US_Dic[section.Key] = section.Value;

    //        }
    //        else
    //        {
    //            StaticData.Zh_CN_Dic[section.Key] = section.Value;
    //        }
    //    }
    //}

    #endregion





}