using Discord;
using Discord.Interactions;
using Discord.WebSocket;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
using System.Threading.Tasks;

namespace ShardedClient.Services
{
    public class InteractionHandlingService
    {
        private readonly InteractionService _service;
        private readonly DiscordShardedClient _client;
        private readonly IServiceProvider _provider;

        public InteractionHandlingService(IServiceProvider services)
        {
            _service = services.GetRequiredService<InteractionService>();
            _client = services.GetRequiredService<DiscordShardedClient>();
            _provider = services;

            _service.Log += LogAsync;
            _client.InteractionCreated += OnInteractionAsync;
            // For examples on how to handle post execution,
            // see the InteractionFramework samples.
        }

        // Register all modules, and add the commands from these modules to either guild or globally depending on the build state.
        public async Task InitializeAsync()
        {
            await _service.AddModulesAsync(typeof(InteractionHandlingService).Assembly, _provider);
#if DEBUG
            await _service.RegisterCommandsToGuildAsync(1 /* implement */);
#else
            await _service.RegisterCommandsGloballyAsync();
#endif
        }

        private async Task OnInteractionAsync(SocketInteraction interaction)
        {
            _ = Task.Run(async () =>
            {
                var context = new ShardedInteractionContext(_client, interaction);
                await _service.ExecuteCommandAsync(context, _provider);
            });
            await Task.CompletedTask;
        }

        private Task LogAsync(LogMessage log)
        {
            Console.WriteLine(log.ToString());

            return Task.CompletedTask;
        }
    }
}