package io.lumine.cosmetics.commands;

import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.api.cosmetics.ColorableCosmetic;
import io.lumine.cosmetics.api.cosmetics.Cosmetic;
import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
import io.lumine.cosmetics.constants.CosmeticType;
import io.lumine.cosmetics.constants.Permissions;
import io.lumine.mythic.bukkit.utils.commands.Command;
import io.lumine.mythic.bukkit.utils.serialize.Chroma;

import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;

import com.google.common.collect.Lists;

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

public class EquipCommand extends Command<MCCosmeticsPlugin> {

    public EquipCommand(Command command) {
        super(command);
    }

    @Override
    public boolean onCommand(CommandSender sender, String[] args) {
        final var player = (Player) sender;
        final var profile = getPlugin().getProfiles().getProfile(player);
        
        var type = args[0];
        var cosmeticName = args[1];

        var maybeManager = getPlugin().getCosmetics().getManager(type);
        if(maybeManager.isEmpty()) {
            CommandHelper.sendError(sender, "Invalid cosmetic type");
            return true;
        }
        
        var manager = maybeManager.get();
        
        var maybeCosmetic = manager.getCosmetic(cosmeticName);
        if(maybeCosmetic.isEmpty()) {
            CommandHelper.sendError(sender, "Specified cosmetic was not found");
            return true;
        }
        var cosmetic = (Cosmetic) maybeCosmetic.get();
        
        if(!profile.has(cosmetic)) {
            CommandHelper.sendError(sender, "You have not unlocked that cosmetic!");
            return true;
        }

        profile.equip(cosmetic);
        CommandHelper.sendSuccess(sender, "Equipped " + CosmeticType.get(manager.getCosmeticClass()).type().toLowerCase() + " " + cosmetic);
        
        return true;
    }

    @Override
    public List<String> onTabComplete(CommandSender sender, String[] args) {
        if(args.length == 1) {
            return StringUtil.copyPartialMatches(args[0], getPlugin().getCosmetics().getRegisteredTypes(), new ArrayList<>());
        }
        if(args.length == 2) {
            var type = args[0];

            var maybeManager = getPlugin().getCosmetics().getManager(type);
            if(maybeManager.isEmpty()) {
                return Collections.emptyList();
            }
            var manager = maybeManager.get();

            final var player = (Player) sender;
            final var profile = getPlugin().getProfiles().getProfile(player);
            
            Collection<String> cosmeticTypes = Lists.newArrayList();
            for(var cosmetic : (Collection<Cosmetic>) manager.getAllCosmetics()) {
                if(profile.has(cosmetic)) {
                    cosmeticTypes.add(cosmetic.getId());
                }
            }
            
            return StringUtil.copyPartialMatches(args[1], cosmeticTypes, new ArrayList<>());
        }
        return Collections.emptyList();
    }

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

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

    @Override
    public String getName() {
        return "equip";
    }
}