package foleon.miningcore;

import org.bukkit.plugin.java.JavaPlugin;

import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class MiningCore extends JavaPlugin implements CommandExecutor {

    private Map<Player, Double> balances;
    private FileConfiguration goldConfig;
    private File goldFile;

    @Override
    public void onEnable() {
        getCommand("givemoney").setExecutor(this);
        getCommand("pay").setExecutor(this);
        getCommand("gold").setExecutor(this);
        balances = new HashMap<>();
        saveDefaultConfig();
        goldFile = new File(getDataFolder(), "gold.yml");
        if (!goldFile.exists()) {
            saveResource("gold.yml", false);
        }
        goldConfig = YamlConfiguration.loadConfiguration(goldFile);
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (command.getName().equalsIgnoreCase("givemoney")) {
            if (sender instanceof Player) {
                Player player = (Player) sender;
                if (args.length == 1) {
                    double amount = parseDouble(args[0]);
                    if (amount > 0) {
                        giveMoney(player, amount);
                        player.sendMessage(colorize("&aВам выдано " + amount + " монет."));
                    } else {
                        player.sendMessage(colorize("&cСумма должна быть положительным числом."));
                    }
                } else {
                    player.sendMessage(colorize("&cИспользование: /givemoney <сумма>"));
                }
            } else {
                sender.sendMessage(colorize("&cЭта команда доступна только игрокам."));
            }
        } else if (command.getName().equalsIgnoreCase("pay")) {
            if (sender instanceof Player) {
                Player player = (Player) sender;
                if (args.length == 2) {
                    Player target = getServer().getPlayer(args[0]);
                    if (target != null) {
                        double amount = parseDouble(args[1]);
                        if (amount > 0) {
                            if (hasEnoughMoney(player, amount)) {
                                payMoney(player, target, amount);
                                player.sendMessage(colorize("&aВы перевели " + amount + " монет игроку " + target.getName()));
                                target.sendMessage(colorize("&aИгрок " + player.getName() + " перевел вам " + amount + " монет."));
                            } else {
                                player.sendMessage(colorize("&cУ вас недостаточно монет."));
                            }
                        } else {
                            player.sendMessage(colorize("&cСумма должна быть положительным числом."));
                        }
                    } else {
                        player.sendMessage(colorize("&cТакого игрока не существует."));
                    }
                } else {
                    player.sendMessage(colorize("&cИспользование: /pay <игрок> <сумма>"));
                }
            } else {
                sender.sendMessage(colorize("&cЭта команда доступна только игрокам."));
            }
        } else if (command.getName().equalsIgnoreCase("gold")) {
            if (sender instanceof Player) {
                Player player = (Player) sender;
                player.sendMessage(colorize("&6Ваш баланс: " + getBalance(player) + " монет."));
            } else {
                sender.sendMessage(colorize("&cЭта команда доступна только игрокам."));
            }
        }
        return true;
    }

    private void giveMoney(Player player, double amount) {
        balances.put(player, getBalance(player) + amount);
        saveBalances();
    }

    private void payMoney(Player sender, Player target, double amount) {
        balances.put(sender, getBalance(sender) - amount);
        balances.put(target, getBalance(target) + amount);
        saveBalances();
    }

    private double getBalance(Player player) {
        return balances.getOrDefault(player, 0.0);
    }

    private boolean hasEnoughMoney(Player player, double amount) {
        return getBalance(player) >= amount;
    }

    private double parseDouble(String string) {
        try {
            return Double.parseDouble(string);
        } catch (NumberFormatException e) {
            return 0;
        }
    }

    private String colorize(String message) {
        return ChatColor.translateAlternateColorCodes('&', message);
    }

    private void saveBalances() {
        for (Player player : balances.keySet()) {
            goldConfig.set(player.getUniqueId().toString(), getBalance(player));
        }
        try {
            goldConfig.save(goldFile);
        } catch (IOException e) {
            getLogger().severe("Unable to save gold.yml: " + e.getMessage());
        }
    }
} cделай чтобы при вводе команды /givemoney сумма денег увеличивалась как в игре так и в конфиге, чтобы у игрока сохранялись деньги после рестарта сервере.