using Newtonsoft.Json;
using System;
using System.IO;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace PSO2SERVER.Json
{
    public class JsonRead
    {
        // 泛型方法：读取并反序列化 JSON 文件
        public static async Task<T> DeserializeJsonAsync<T>(string filePath, JsonSerializerSettings settings = null)
        {
            if (string.IsNullOrEmpty(filePath))
            {
                Logger.Write("文件路径不能为空");
                return default(T);
            }

            if (!File.Exists(filePath))
            {
                Logger.Write($"文件不存在: {filePath}");
                return default(T);
            }

            try
            {
                // 异步读取文件内容
                string json = await Task.Run(() => File.ReadAllText(filePath));

                // 如果文件内容为空，记录日志并返回默认值
                if (string.IsNullOrWhiteSpace(json))
                {
                    Logger.Write($"文件内容为空: {filePath}");
                    return default(T);
                }

                // 反序列化 JSON
                return JsonConvert.DeserializeObject<T>(json, settings ?? new JsonSerializerSettings());
            }
            catch (JsonException jsonEx)
            {
                // 捕获 JSON 反序列化异常
                Logger.Write($"JSON 反序列化错误：{jsonEx.Message} 文件: {filePath}");
                return default(T);
            }
            catch (FileNotFoundException fnfEx)
            {
                // 捕获文件找不到异常
                Logger.Write($"文件未找到错误：{fnfEx.Message} 文件: {filePath}");
                return default(T);
            }
            catch (UnauthorizedAccessException uaEx)
            {
                // 捕获权限相关的异常
                Logger.Write($"权限错误：{uaEx.Message} 文件: {filePath}");
                return default(T);
            }
            catch (Exception ex)
            {
                // 捕获其他未知异常
                Logger.Write($"读取或反序列化文件 {filePath} 时发生异常: {ex.Message}");
                return default(T);
            }
        }

        // 同步版本：用于不需要异步操作的场景
        public static T DeserializeJson<T>(string filePath, JsonSerializerSettings settings = null)
        {
            if (string.IsNullOrEmpty(filePath))
            {
                Logger.Write("文件路径不能为空");
                return default(T);
            }

            if (!File.Exists(filePath))
            {
                Logger.Write($"文件不存在: {filePath}");
                return default(T);
            }

            try
            {
                string json = File.ReadAllText(filePath);

                if (string.IsNullOrWhiteSpace(json))
                {
                    Logger.Write($"文件内容为空: {filePath}");
                    return default(T);
                }

                return JsonConvert.DeserializeObject<T>(json, settings ?? new JsonSerializerSettings());
            }
            catch (JsonException jsonEx)
            {
                Logger.Write($"JSON 反序列化错误：{jsonEx.Message} 文件: {filePath}");
                return default(T);
            }
            catch (Exception ex)
            {
                Logger.Write($"读取或反序列化文件 {filePath} 时发生异常: {ex.Message}");
                return default(T);
            }
        }
    }
}
