#nullable disable
using EllieBot.Modules.Gambling.Common;
using EllieBot.Modules.Gambling.Common.Events;
using EllieBot.Modules.Gambling.Services;
using EllieBot.Db.Models;

namespace EllieBot.Modules.Gambling;

public partial class Gambling
{
    [Group]
    public partial class CurrencyEventsCommands : GamblingModule<CurrencyEventsService>
    {
        public CurrencyEventsCommands(GamblingConfigService gamblingConf)
            : base(gamblingConf)
        {
        }

        [Cmd]
        [RequireContext(ContextType.Guild)]
        [EllieOptions<EventOptions>]
        [OwnerOnly]
        public async Task EventStart(CurrencyEvent.Type ev, params string[] options)
        {
            var (opts, _) = OptionsParser.ParseFrom(new EventOptions(), options);
            if (!await _service.TryCreateEventAsync(ctx.Guild.Id, ctx.Channel.Id, ev, opts, GetEmbed))
                await Response().Error(strs.start_event_fail).SendAsync();
        }

        private EmbedBuilder GetEmbed(CurrencyEvent.Type type, EventOptions opts, long currentPot)
            => type switch
            {
                CurrencyEvent.Type.Reaction => CreateEmbed()
                                                  .WithOkColor()
                                                  .WithTitle(GetText(strs.event_title(type.ToString())))
                                                  .WithDescription(GetReactionDescription(opts.Amount, currentPot))
                                                  .WithFooter(GetText(strs.event_duration_footer(opts.Hours))),
                CurrencyEvent.Type.GameStatus => CreateEmbed()
                                                    .WithOkColor()
                                                    .WithTitle(GetText(strs.event_title(type.ToString())))
                                                    .WithDescription(GetGameStatusDescription(opts.Amount, currentPot))
                                                    .WithFooter(GetText(strs.event_duration_footer(opts.Hours))),
                _ => throw new ArgumentOutOfRangeException(nameof(type))
            };

        private string GetReactionDescription(long amount, long potSize)
        {
            var potSizeStr = Format.Bold(potSize == 0 ? "∞" + CurrencySign : N(potSize));

            return GetText(strs.new_reaction_event(CurrencySign, Format.Bold(N(amount)), potSizeStr));
        }

        private string GetGameStatusDescription(long amount, long potSize)
        {
            var potSizeStr = Format.Bold(potSize == 0 ? "∞" + CurrencySign : potSize + CurrencySign);

            return GetText(strs.new_gamestatus_event(CurrencySign, Format.Bold(N(amount)), potSizeStr));
        }
    }
}