package de.iani.treasurechest.commands;

import de.iani.cubesideutils.bukkit.commands.SubCommand;
import de.iani.cubesideutils.bukkit.commands.exceptions.DisallowsCommandBlockException;
import de.iani.cubesideutils.bukkit.commands.exceptions.IllegalSyntaxException;
import de.iani.cubesideutils.bukkit.commands.exceptions.InternalCommandException;
import de.iani.cubesideutils.bukkit.commands.exceptions.NoPermissionException;
import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException;
import de.iani.cubesideutils.commands.ArgsParser;
import de.iani.playerUUIDCache.CachedPlayer;
import de.iani.treasurechest.Permissions;
import de.iani.treasurechest.TreasureChest;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;

public class TransferCommand extends SubCommand {
    private TreasureChest plugin;

    public TransferCommand(TreasureChest plugin) {
        this.plugin = plugin;
    }

    @Override
    public String getRequiredPermission() {
        return Permissions.TRANSFER;
    }

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

    @Override
    public String getUsage() {
        return "<fromplayer> <toplayer> CONFIRM";
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String alias, String commandString, ArgsParser args) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException {
        if (args.remaining() != 3) {
            plugin.sendMessage(sender, commandString + getUsage(), true);
            return true;
        }
        CachedPlayer fromPlayer = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(args.getNext(), true);
        if (fromPlayer == null) {
            plugin.sendMessage(sender, "Unknown old player!", true);
            return true;
        }
        CachedPlayer toPlayer = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(args.getNext(), true);
        if (toPlayer == null) {
            plugin.sendMessage(sender, "Unknown new player!", true);
            return true;
        }

        if (!args.getNext().equals("CONFIRM")) {
            plugin.sendMessage(sender, commandString + getUsage(), true);
            return true;
        }

        try {
            int transfered = plugin.getDatabase().transferItems(fromPlayer.getUniqueId(), toPlayer.getUniqueId());
            if (plugin.getServer().getPlayer(fromPlayer.getUniqueId()) != null) {
                plugin.getData().reloadTreasureChest(fromPlayer.getUniqueId());
            } else {
                plugin.getData().unloadTreasureChest(fromPlayer.getUniqueId());
            }
            if (plugin.getServer().getPlayer(toPlayer.getUniqueId()) != null) {
                plugin.getData().reloadTreasureChest(toPlayer.getUniqueId());
            } else {
                plugin.getData().unloadTreasureChest(toPlayer.getUniqueId());
            }

            plugin.sendMessage(sender, transfered == 0 ? (fromPlayer.getName() + " hatte keine Items in seiner Schatztruhe!") : (transfered + " Items wurden von " + fromPlayer.getName() + " zu " + toPlayer.getName() + " übertragen!"));
        } catch (SQLException e) {
            plugin.sendMessage(sender, "Datenbankfehler", true);
            plugin.getLogger().log(Level.SEVERE, "Could not transfer items from " + fromPlayer.getUniqueId() + " to " + toPlayer.getUniqueId() + ": " + e.getMessage(), e);
            return true;
        }
        return true;
    }

    @Override
    public Collection<String> onTabComplete(CommandSender sender, Command command, String alias, ArgsParser args) {
        if (args.remaining() < 3) {
            return null;
        }
        return List.of();
    }
}
