using System;
using System.Text;
using System.Threading.Tasks;
using CoolGameX;
using UnityEngine;

/// <summary>
/// CoolAPI playground — try every SDK feature from on-screen buttons.
///
///  1. Tools › Cool GameX › Setup: enter your game slug and sign in (once).
///  2. Drop this script on any GameObject and press Play.
///  3. Click the buttons. Press F8 any time for the SDK debug overlay.
///
/// No Initialize() call needed — the SDK starts itself from the settings asset.
/// When your game is started from the Cool GameX launcher, the player's session
/// is picked up automatically.
/// </summary>
public class CoolGameXTester : MonoBehaviour
{
    [Tooltip("Achievement slug for the Unlock button (tip: use the generated Ids.Achievements.* constants).")]
    public string achievementSlug = "test";

    [Tooltip("Leaderboard the Submit button posts random scores to. Created on first submit.")]
    public string leaderboard = "high_score";

    [Serializable]
    private class DemoSave
    {
        public int level;
        public float health;
        public string savedAt;
    }

    private string status = "Starting…";
    private string details = "";
    private bool busy;
    private GUIStyle title, text;

    private void OnEnable() => CoolAPI.SignedIn += OnSignedIn;
    private void OnDisable() => CoolAPI.SignedIn -= OnSignedIn;
    private void OnSignedIn(PlayerProfile p) => status = $"Signed in as {p.username} — ready.";

    private void OnGUI()
    {
        title ??= new GUIStyle(GUI.skin.label) { fontSize = 18, fontStyle = FontStyle.Bold };
        text ??= new GUIStyle(GUI.skin.label) { fontSize = 13, wordWrap = true };

        GUILayout.BeginArea(new Rect(20, 20, 380, Screen.height - 40), GUI.skin.box);
        GUILayout.Label($"CoolAPI {CoolAPI.Version} playground", title);
        GUILayout.Label(CoolAPI.StatusLine(), text);

        if (!CoolAPI.IsInitialized)
        {
            GUILayout.Label("The SDK isn't running yet. Open Tools › Cool GameX › Setup and enter your game slug.", text);
            GUILayout.EndArea();
            return;
        }
        if (!CoolAPI.IsAuthenticated)
            GUILayout.Label("Not signed in — sign in from Tools › Cool GameX › Setup, then press Play again.", text);

        GUILayout.Space(8);
        GUI.enabled = !busy && CoolAPI.IsAuthenticated;
        if (Button($"Unlock '{achievementSlug}'")) Run(Unlock);
        if (Button("Stat: clicks +1")) Run(AddStat);
        if (Button($"Submit a random score to '{leaderboard}'")) Run(Submit);
        if (Button("Show top 5")) Run(ShowTop);
        if (Button("Cloud save")) Run(Save);
        if (Button("Cloud load")) Run(Load);
        if (Button("Do I own this game?")) Run(Owns);
        GUI.enabled = true;

        GUILayout.Space(8);
        GUILayout.Label(status, text);
        if (!string.IsNullOrEmpty(details)) GUILayout.Label(details, text);
        GUILayout.FlexibleSpace();
        GUILayout.Label("Press F8 for the SDK debug overlay.", text);
        GUILayout.EndArea();
    }

    private static bool Button(string label) => GUILayout.Button(label, GUILayout.Height(30));

    private async void Run(Func<Task> action)
    {
        busy = true;
        details = "";
        try { await action(); }
        catch (Exception e) { status = "Error: " + e.Message; Debug.LogException(e); }
        finally { busy = false; }
    }

    private async Task Unlock()
    {
        var r = await CoolAPI.Achievements.UnlockDetailed(achievementSlug);
        status = !r.Success ? $"Unlock failed: {r.Error}"
               : r.Queued ? "Offline — unlock saved and will sync automatically."
               : r.NewlyUnlocked ? $"Unlocked '{achievementSlug}'!"
               : $"'{achievementSlug}' was already unlocked.";
    }

    private async Task AddStat()
    {
        int total = await CoolAPI.Stats.Add("clicks");
        status = total >= 0 ? $"clicks = {total}" : "Stat change saved (offline).";
    }

    private async Task Submit()
    {
        long score = UnityEngine.Random.Range(100, 10000);
        var r = await CoolAPI.Leaderboards.Submit(leaderboard, score);
        status = r.Success
            ? $"Submitted {score}. Your best: {r.Score} (rank #{r.Rank}){(r.Improved ? " — new best!" : "")}"
            : $"Submit failed: {r.Error}";
    }

    private async Task ShowTop()
    {
        var page = await CoolAPI.Leaderboards.GetTop(leaderboard, 5);
        if (!page.ok) { status = "Couldn't load the leaderboard: " + CoolAPI.LastError; return; }
        var sb = new StringBuilder();
        foreach (var e in page.entries) sb.AppendLine($"#{e.rank}  {e.username}  {e.score}");
        status = page.entries.Length == 0 ? "No scores yet — submit one!" : $"Top {page.entries.Length} of {page.total}:";
        details = sb.ToString();
    }

    private async Task Save()
    {
        var save = new DemoSave { level = UnityEngine.Random.Range(1, 30), health = UnityEngine.Random.value * 100f, savedAt = DateTime.Now.ToString("HH:mm:ss") };
        bool ok = await CoolAPI.CloudSave.Save("slot1", save);
        status = ok ? $"Saved slot1: level {save.level}, {save.health:0} HP at {save.savedAt}" : "Save failed: " + CoolAPI.LastError;
    }

    private async Task Load()
    {
        var save = await CoolAPI.CloudSave.Load<DemoSave>("slot1");
        status = save == null ? "slot1 is empty — save first." : $"Loaded slot1: level {save.level}, {save.health:0} HP (saved {save.savedAt})";
    }

    private async Task Owns()
    {
        bool owns = await CoolAPI.Ownership.OwnsGame(refresh: true);
        status = owns ? "Yes — this game is in your library." : "Not in your library (demo / not purchased).";
    }
}
