using Discord;
using Discord.Interactions;
using Discord.WebSocket;
using System;
using System.Threading.Tasks;

namespace InteractionFramework.Attributes
{
    internal class DoUserCheck : PreconditionAttribute
    {
        public override Task<PreconditionResult> CheckRequirementsAsync(IInteractionContext context, ICommandInfo commandInfo, IServiceProvider services)
        {
            // Check if the component matches the target properly.
            if (context.Interaction is not SocketMessageComponent componentContext)
                return Task.FromResult(PreconditionResult.FromError("Context unrecognized as component context."));

            else
            {
                // The approach here entirely depends on how you construct your custom ID. In this case, the format is:
                // unique-name:*,*

                // here the name and wildcards are split by ':'
                var param = componentContext.Data.CustomId.Split(':');

                // here we determine that we should always check for the first ',' present.
                // This will deal with additional wildcards by always selecting the first wildcard present.
                if (param.Length > 1 && ulong.TryParse(param[1].Split(',')[0], out ulong id))
                    return (context.User.Id == id)
                        // If the user ID
                        ? Task.FromResult(PreconditionResult.FromSuccess())
                        : Task.FromResult(PreconditionResult.FromError("User ID does not match component ID!"));

                else return Task.FromResult(PreconditionResult.FromError("Parse cannot be done if no userID exists."));
            }
        }
    }
}