using System.Net.Http;

namespace AxCopilot.Services;

/// <summary>
/// 날씨 위젯용 데이터 서비스.
/// 사외 모드에서만 외부 API(wttr.in)를 호출하며 30분간 결과를 캐시합니다.
/// 사내 모드(InternalModeEnabled=true)에서는 "--"를 즉시 반환합니다.
/// </summary>
internal static class WeatherWidgetService
{
    private static string?   _cached;
    private static DateTime  _cacheTime = DateTime.MinValue;
    private static bool      _fetching;
    private static readonly TimeSpan _ttl = TimeSpan.FromMinutes(30);

    /// <summary>현재 캐시된 날씨 텍스트 (없으면 "--")</summary>
    public static string CachedText => _cached ?? "--";

    /// <summary>
    /// 날씨 정보를 비동기로 갱신합니다.
    /// 사내 모드이거나 캐시 유효 기간 내이면 즉시 반환합니다.
    /// </summary>
    public static async Task RefreshAsync(bool internalMode)
    {
        if (internalMode)
        {
            _cached = "--";
            return;
        }

        // 캐시 유효하면 재호출 불필요
        if (_cached != null && DateTime.Now - _cacheTime < _ttl) return;
        if (_fetching) return;

        _fetching = true;
        try
        {
            using var client = new HttpClient();
            client.Timeout = TimeSpan.FromSeconds(6);
            // wttr.in: %c = 날씨 조건 이모지, %t = 기온
            var raw = await client.GetStringAsync("https://wttr.in/?format=%c+%t");
            _cached   = raw.Trim().Replace("+", " ");
            _cacheTime = DateTime.Now;
        }
        catch (Exception ex)
        {
            LogService.Warn($"날씨 위젯 갱신 실패: {ex.Message}");
            _cached ??= "--";
        }
        finally
        {
            _fetching = false;
        }
    }

    /// <summary>캐시를 강제 초기화하여 다음 호출 시 재조회합니다.</summary>
    public static void Invalidate()
    {
        _cached    = null;
        _cacheTime = DateTime.MinValue;
    }
}
