using System;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using UnityEditor;
using UnityEngine;

namespace Furlumin.SDK.Editor
{
    
    [InitializeOnLoad]
    internal static class FurluminUpdater
    {
        
        private const string CurrentVersion = "1.0.4";
        private const string PackageName    = "com.furlumin.sdk";
        private const string ManifestUrl    = "https://api.furlumin.de/api/sdk/manifest";
        private const string LastCheckPref  = "Furlumin.SDK.LastUpdateCheck";
        private const double CheckIntervalH = 1.0; 

        private static readonly HttpClient Http = new HttpClient
        {
            Timeout = TimeSpan.FromSeconds(10)
        };

        private static SdkPackageInfo _pendingUpdate;

        static FurluminUpdater()
        {
            EditorApplication.delayCall += OnEditorReady;
        }

        private static void OnEditorReady()
        {
            
            var lastStr = EditorPrefs.GetString(LastCheckPref, "");
            if (DateTime.TryParse(lastStr, null, System.Globalization.DateTimeStyles.RoundtripKind, out var last)
                && (DateTime.UtcNow - last).TotalHours < CheckIntervalH)
                return;

            EditorPrefs.SetString(LastCheckPref, DateTime.UtcNow.ToString("o"));
            _ = CheckForUpdatesAsync();
        }

        private static async Task CheckForUpdatesAsync()
        {
            try
            {
                string json = await Http.GetStringAsync(ManifestUrl);
                var manifest = JsonUtility.FromJson<SdkManifest>(json);
                if (manifest?.packages == null) return;

                var latest = manifest.packages.FirstOrDefault(p => p.name == PackageName);
                if (latest == null) return;

                if (IsNewer(latest.version, CurrentVersion))
                {
                    _pendingUpdate = latest;
                    
                    EditorApplication.delayCall += ShowUpdateDialog;
                }
            }
            catch (Exception ex)
            {
                Debug.LogWarning($"[Furlumin SDK] Update-Check fehlgeschlagen: {ex.Message}");
            }
        }

        private static void ShowUpdateDialog()
        {
            var pkg = _pendingUpdate;
            _pendingUpdate = null;
            if (pkg == null) return;

            bool download = EditorUtility.DisplayDialog(
                "Furlumin SDK – Update verfügbar",
                $"Version {pkg.version} ist verfügbar.\n" +
                $"Installiert: {CurrentVersion}\n\n" +
                "Jetzt herunterladen?",
                "Herunterladen",
                "Später"
            );

            if (download)
                Application.OpenURL(pkg.downloadUrl);
        }

        private static bool IsNewer(string remote, string local)
        {
            try { return new Version(remote) > new Version(local); }
            catch { return string.Compare(remote, local, StringComparison.Ordinal) > 0; }
        }

        [Serializable] private class SdkManifest    { public SdkPackageInfo[] packages; }
        [Serializable] private class SdkPackageInfo { public string name; public string version; public string downloadUrl; }
    }
}
