package io.lumine.cosmetics.commands;

import io.lumine.cosmetics.MCCosmeticsPlugin;
import io.lumine.cosmetics.api.cosmetics.ColorableCosmetic;
import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
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 java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

public class DyeCommand extends Command<MCCosmeticsPlugin> {

    public DyeCommand(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];
        Chroma color;
        try {
            color = Chroma.of(args[1]);
        } catch(Exception | Error ex) {
            ex.printStackTrace();
            CommandHelper.sendError(sender, "Invalid dye color");
            return true;
        }
        
        var maybeManager = getPlugin().getCosmetics().getManager(type);
        if(maybeManager.isEmpty()) {
            CommandHelper.sendError(sender, "Invalid cosmetic type");
            return true;
        }
        
        var manager = maybeManager.get();
        
        Optional<EquippedCosmetic> maybeEquipped = profile.getEquipped(manager.getCosmeticClass());
        if(maybeEquipped.isEmpty()) {
            CommandHelper.sendError(sender, "You don't have that type of cosmetic equipped!");
            return true;
        }
        
        var equipped = maybeEquipped.get();

        if(!(equipped.getCosmetic() instanceof ColorableCosmetic colorable) || !colorable.isColorable()) {
            CommandHelper.sendError(sender, "The cosmetic you're wearing isn't dyeable!");
            return true;
        }

        profile.equip(equipped.getCosmetic(), color);
        
        return true;
    }

    @Override
    public List<String> onTabComplete(CommandSender sender, String[] args) {
        if(args.length == 1) {
            return StringUtil.copyPartialMatches(args[0], getPlugin().getCosmetics().getRegisteredTypes((man) -> man.getClass().isAssignableFrom(ColorableCosmetic.class)), new ArrayList<>());
        }
        return Collections.emptyList();
    }

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

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

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