using System.IO;
using System.Text.Json;
using PersonalToolBox.Models;

namespace PersonalToolBox.Services;

/// <summary>
/// 基于 JSON 文件的数据持久化服务
/// 配置文件路径: 可执行程序目录/config.json
/// </summary>
public class JsonDataService : IDataService
{
    private readonly ILogService _logService;
    private readonly string _filePath;

    private static readonly JsonSerializerOptions JsonOptions = new()
    {
        WriteIndented = true,
        PropertyNameCaseInsensitive = true
    };

    public AppConfig Config { get; private set; } = new();

    public JsonDataService(ILogService logService)
    {
        _logService = logService;
        _filePath = Path.Combine(AppContext.BaseDirectory, "config.json");
    }

    public void Load()
    {
        if (!File.Exists(_filePath))
        {
            _logService.Info("配置文件不存在，使用默认配置");
            Config = new AppConfig();
            Save();
            return;
        }

        try
        {
            var json = File.ReadAllText(_filePath);
            var config = JsonSerializer.Deserialize<AppConfig>(json, JsonOptions);

            if (config == null)
            {
                _logService.Warning("配置文件解析结果为空，使用默认配置");
                Config = new AppConfig();
                return;
            }

            Config = config;

            // 核心容错逻辑：验证所有工具路径是否有效
            foreach (var tool in Config.Tools)
            {
                if (string.IsNullOrWhiteSpace(tool.ExecutablePath))
                    continue;

                // URL 格式的路径（如 https://...）不需要检查本地文件是否存在
                if (Uri.TryCreate(tool.ExecutablePath, UriKind.Absolute, out var uri) &&
                    (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps))
                {
                    tool.IsValid = true;
                    continue;
                }

                // 纯文件名（无路径分隔符）可能位于系统 PATH 中，不标记为失效
                if (!tool.ExecutablePath.Contains('\\') && !tool.ExecutablePath.Contains('/'))
                {
                    tool.IsValid = true;
                    continue;
                }

                if (!File.Exists(tool.ExecutablePath))
                {
                    tool.IsValid = false;
                    _logService.Warning($"工具 \"{tool.Name}\" 路径失效，找不到文件: {tool.ExecutablePath}");
                }
                else
                {
                    tool.IsValid = true;
                }
            }

            _logService.Info($"配置加载完成: {Config.Categories.Count} 个分类, {Config.Tools.Count} 个工具");
        }
        catch (JsonException ex)
        {
            _logService.Error($"配置文件 JSON 解析失败: {ex.Message}");
            Config = new AppConfig();
        }
        catch (Exception ex)
        {
            _logService.Error($"配置文件加载失败: {ex.Message}");
            Config = new AppConfig();
        }
    }

    public void Save()
    {
        try
        {
            var json = JsonSerializer.Serialize(Config, JsonOptions);
            File.WriteAllText(_filePath, json);
            _logService.Info("配置已保存");
        }
        catch (Exception ex)
        {
            _logService.Error($"配置保存失败: {ex.Message}");
        }
    }
}
