using System.IO;
using System.Text.Json;

namespace AxCopilot.Services;

/// <summary>
/// 런처 검색 히스토리를 로컬 파일로 관리합니다.
/// ↑/↓ 키로 이전 검색어를 탐색할 수 있습니다.
/// 최대 50개 FIFO — 가장 최근 항목이 index 0.
/// 저장 위치: %APPDATA%\AxCopilot\search_history.json
/// </summary>
internal static class SearchHistoryService
{
    private const int MaxItems = 50;

    private static readonly string _file = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
        "AxCopilot", "search_history.json");

    private static List<string> _history = new();
    private static bool _loaded;
    private static readonly object _lock = new();

    // ─── 공개 API ─────────────────────────────────────────────────────────────

    /// <summary>
    /// 검색어를 히스토리에 추가합니다.
    /// 공백·짧은 쿼리·중복(최근 항목)은 추가하지 않습니다.
    /// </summary>
    public static void Add(string query)
    {
        if (string.IsNullOrWhiteSpace(query) || query.Trim().Length < 2) return;
        var q = query.Trim();
        EnsureLoaded();
        lock (_lock)
        {
            // 이미 최상단이면 중복 추가 안 함
            if (_history.Count > 0 && _history[0] == q) return;
            // 기존 동일 항목 제거 후 맨 앞에 삽입
            _history.Remove(q);
            _history.Insert(0, q);
            if (_history.Count > MaxItems) _history.RemoveAt(_history.Count - 1);
        }
        _ = SaveAsync();
    }

    /// <summary>전체 히스토리 목록 반환 (최신 → 오래된 순)</summary>
    public static IReadOnlyList<string> GetAll()
    {
        EnsureLoaded();
        lock (_lock) return _history.AsReadOnly();
    }

    /// <summary>히스토리 전체 삭제</summary>
    public static void Clear()
    {
        lock (_lock) _history.Clear();
        _ = SaveAsync();
    }

    // ─── 내부 ──────────────────────────────────────────────────────────────────

    private static void EnsureLoaded()
    {
        if (_loaded) return;
        lock (_lock)
        {
            if (_loaded) return;
            try
            {
                if (File.Exists(_file))
                {
                    var json = File.ReadAllText(_file);
                    _history = JsonSerializer.Deserialize<List<string>>(json) ?? new();
                }
            }
            catch (Exception ex)
            {
                LogService.Warn($"search_history.json 로드 실패: {ex.Message}");
                _history = new();
            }
            _loaded = true;
        }
    }

    private static async Task SaveAsync()
    {
        try
        {
            List<string> snapshot;
            lock (_lock) snapshot = new List<string>(_history);
            Directory.CreateDirectory(Path.GetDirectoryName(_file)!);
            var json = JsonSerializer.Serialize(snapshot);
            await File.WriteAllTextAsync(_file, json);
        }
        catch (Exception ex)
        {
            LogService.Warn($"search_history.json 저장 실패: {ex.Message}");
        }
    }
}
