using System;
using System.Threading.Tasks;
using UnityEngine;

namespace Arkadium.Interop
{
    /// <summary>
    /// Mock WebGL interop provider for testing and editor use
    /// </summary>
    public class MockWebGLInteropProvider : IWebGLInteropProvider
    {
        public async Task<T> InvokeAsync<T>(string methodName, object parameters = null)
        {
            // Simulate async behavior
            await Task.Delay(10);

            // Return mock data based on method name
            return GetMockResult<T>(methodName, parameters);
        }

        public void InvokeVoid(string methodName, object parameters = null)
        {
            // Log the call for debugging
            Debug.Log($"[Mock] InvokeVoid: {methodName} with params: {JsonUtility.ToJson(parameters)}");
        }

        private T GetMockResult<T>(string methodName, object parameters)
        {
            // Wallet methods
            if (methodName == "wallet.isGemsSupported")
                return (T)(object)true;

            if (methodName == "wallet.getGems")
                return (T)(object)10000;

            if (methodName == "wallet.consumeGems")
                return (T)(object)true;

            // Tournament methods
            if (methodName == "tournaments.getTournaments")
                return (T)(object)GetMockTournamentsJson();

            if (methodName == "tournaments.hasJoinedTournament")
                return (T)(object)(parameters?.ToString().Contains("tournament_1") == true);

            if (methodName == "tournaments.joinTournament")
                return (T)(object)true;

            if (methodName == "tournaments.canSubmitScoreToTournament")
                return (T)(object)(parameters?.ToString().Contains("tournament_1") == true);

            if (methodName == "tournaments.submitTournamentScore")
            {
                Debug.Log($"[Mock] Submitted tournament score: {JsonUtility.ToJson(parameters)}");
                return (T)(object)true;
            }

            if (methodName == "tournaments.getTopTournamentEntries")
                return (T)(object)GetMockTournamentEntriesJson();

            if (methodName == "tournaments.getTournamentUserEntry")
                return (T)(object)GetMockUserEntryJson();

            if (methodName == "tournaments.getTournamentUsersEntries")
                return (T)(object)GetMockTournamentEntriesJson();

            if (methodName == "tournaments.getTournamentEntriesAroundUser")
                return (T)(object)GetMockTournamentEntriesJson();

            // Default fallback
            Debug.LogWarning($"[Mock] Unknown method: {methodName}");
            return default(T);
        }

        private string GetMockTournamentsJson()
        {
            var tournaments = new Tournament[]
            {
                new Tournament
                {
                    id = "tournament_1",
                    title = "Daily Challenge",
                    description = "Complete daily challenges to earn rewards",
                    duration = 86400,
                    category = 1,
                    sortOrder = 1,
                    size = 150,
                    maxSize = 1000,
                    maxNumScore = 3,
                    canEnter = true,
                    nextReset = DateTimeOffset.UtcNow.AddHours(24).ToUnixTimeSeconds(),
                    createTime = DateTimeOffset.UtcNow.AddDays(-1).ToUnixTimeSeconds(),
                    startTime = DateTimeOffset.UtcNow.AddDays(-1).ToUnixTimeSeconds(),
                    endTime = DateTimeOffset.UtcNow.AddDays(7).ToUnixTimeSeconds(),
                    startActive = DateTimeOffset.UtcNow.AddDays(-1).ToUnixTimeSeconds(),
                    endActive = DateTimeOffset.UtcNow.AddDays(7).ToUnixTimeSeconds()
                },
                new Tournament
                {
                    id = "tournament_2",
                    title = "Weekly Championship",
                    description = "Compete against the best players",
                    duration = 604800,
                    category = 2,
                    sortOrder = 1,
                    size = 75,
                    maxSize = 500,
                    maxNumScore = 5,
                    canEnter = true,
                    nextReset = DateTimeOffset.UtcNow.AddDays(7).ToUnixTimeSeconds(),
                    createTime = DateTimeOffset.UtcNow.AddDays(-7).ToUnixTimeSeconds(),
                    startTime = DateTimeOffset.UtcNow.AddDays(-7).ToUnixTimeSeconds(),
                    endTime = DateTimeOffset.UtcNow.AddDays(14).ToUnixTimeSeconds(),
                    startActive = DateTimeOffset.UtcNow.AddDays(-7).ToUnixTimeSeconds(),
                    endActive = DateTimeOffset.UtcNow.AddDays(14).ToUnixTimeSeconds()
                }
            };

            var wrapper = new TournamentArrayWrapper { tournaments = tournaments };
            return JsonUtility.ToJson(wrapper);
        }

        private string GetMockTournamentEntriesJson()
        {
            var entries = new TournamentEntry[]
            {
                new TournamentEntry
                {
                    ownerId = "user_1",
                    rank = 1,
                    score = 1000,
                    subscore = 50,
                    username = "Player1",
                    numScore = 1,
                    maxNumScore = 3
                },
                new TournamentEntry
                {
                    ownerId = "user_2",
                    rank = 2,
                    score = 900,
                    subscore = 45,
                    username = "Player2",
                    numScore = 1,
                    maxNumScore = 3
                },
                new TournamentEntry
                {
                    ownerId = "current_user",
                    rank = 3,
                    score = 750,
                    subscore = 35,
                    username = "CurrentPlayer",
                    numScore = 1,
                    maxNumScore = 3
                }
            };

            var wrapper = new TournamentEntryArrayWrapper { entries = entries };
            return JsonUtility.ToJson(wrapper);
        }

        private string GetMockUserEntryJson()
        {
            var entry = new TournamentEntry
            {
                ownerId = "current_user",
                rank = 3,
                score = 750,
                subscore = 35,
                username = "CurrentPlayer",
                numScore = 1,
                maxNumScore = 3
            };

            return JsonUtility.ToJson(entry);
        }
    }
}