package io.lumine.cosmetics.commands;

import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.api.players.CosmeticProfile;
import io.lumine.cosmetics.constants.Permissions;
import io.lumine.cosmetics.managers.gestures.Gesture;
import io.lumine.cosmetics.managers.gestures.GestureManager;
import io.lumine.cosmetics.players.Profile;
import io.lumine.mythic.bukkit.utils.commands.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class EmotesCommand extends Command<MCCosmeticsPlugin> {
    public EmotesCommand(MCCosmeticsPlugin plugin) {
        super(plugin);
    }

    @Override
    public boolean onCommand(CommandSender commandSender, String[] strings) {

        if(strings.length == 0) {
            CommandHelper.sendError(commandSender, "Syntax: /emote [emote_name]");
            return false;
        }

        Optional<Profile> maybeProfile = plugin.getProfiles().getProfile(((Player)commandSender).getName());

        maybeProfile.ifPresent(profile -> {
            var maybeCosmetic = getPlugin().getGestureManager().getCosmetic(strings[0]);

            maybeCosmetic.ifPresent(gesture -> {

                if(commandSender.hasPermission(gesture.getPermission())) {
                    gesture.equip(profile);
                    ((GestureManager) gesture.getManager()).playGesture(profile);
                }
            });
        });

        return true;
    }

    @Override
    public List<String> onTabComplete(CommandSender commandSender, String[] strings) {
        if(strings.length == 1) {
            List<String> emotes = new ArrayList<>();
            for(Gesture gesture : getPlugin().getGestureManager().getAllCosmetics()){
                emotes.add(gesture.getKey());

            }
            return StringUtil.copyPartialMatches(strings[0], emotes, new ArrayList<>());
        }
        return null;
    }

    @Override
    public String getPermissionNode() {
        return Permissions.COMMAND_EMOTES;
    }

    @Override
    public boolean isConsoleFriendly() {
        return false;
    }

    @Override
    public String getName() {
        return null;
    }
}