#nullable enable
using System;
using UnityEngine;

namespace IGP.UnitySDK.Samples
{
    /// <summary>
    /// Sample focused on achievements reporting through the public IGPSDK facade.
    /// </summary>
    public sealed class IGPAchievementsSample : MonoBehaviour
    {
        [Header("References")]
        [SerializeField] private IGPRuntimeManager? runtimeManager = null;

        [Header("Unlock Achievement")]
        [SerializeField] private string unlockAchievementKey = "first_session";

        [Header("Progress Achievement")]
        [SerializeField] private string progressAchievementKey = "matches_played";
        [SerializeField] private double progressValue = 1d;
        [SerializeField] private string progressSourceKey = "sample_match_complete";

        [Header("Auto Report")]
        [SerializeField] private bool unlockOnRoomJoin = false;

        private void Awake()
        {
            runtimeManager ??= FindObjectOfType<IGPRuntimeManager>();
        }

        private void OnEnable()
        {
            if (runtimeManager == null)
            {
                Debug.LogWarning("[IGP AchievementsSample] IGPRuntimeManager not found.");
                return;
            }

            runtimeManager.onRoomJoined.AddListener(HandleRoomJoined);
            runtimeManager.onError.AddListener(HandleError);
        }

        private void OnDisable()
        {
            if (runtimeManager == null)
            {
                return;
            }

            runtimeManager.onRoomJoined.RemoveListener(HandleRoomJoined);
            runtimeManager.onError.RemoveListener(HandleError);
        }

        public async void UnlockAchievement()
        {
            if (runtimeManager == null)
            {
                return;
            }

            try
            {
                var result = await IGPSDK.UnlockAchievementAsync(runtimeManager, unlockAchievementKey);
                Debug.Log($"[IGP AchievementsSample] Unlock success={result.success}, duplicated={result.duplicated}, message={result.message}");
            }
            catch (Exception ex)
            {
                Debug.LogError($"[IGP AchievementsSample] UnlockAchievement failed: {ex.Message}");
            }
        }

        public async void ReportProgress()
        {
            if (runtimeManager == null)
            {
                return;
            }

            try
            {
                var result = await IGPSDK.ReportAchievementProgressAsync(
                    runtimeManager,
                    progressAchievementKey,
                    progressValue,
                    progressSourceKey);

                Debug.Log($"[IGP AchievementsSample] ReportProgress success={result.success}, duplicated={result.duplicated}, message={result.message}");
            }
            catch (Exception ex)
            {
                Debug.LogError($"[IGP AchievementsSample] ReportProgress failed: {ex.Message}");
            }
        }

        private void HandleRoomJoined(Models.Room room)
        {
            Debug.Log($"[IGP AchievementsSample] Room joined id={room.id}, code={room.code}");

            if (unlockOnRoomJoin)
            {
                UnlockAchievement();
            }
        }

        private void HandleError(string error)
        {
            Debug.LogError($"[IGP AchievementsSample] Runtime error: {error}");
        }
    }
}
