package net.viper.bceconomy;

import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.plugin.ServicePriority;
import org.bukkit.plugin.java.JavaPlugin;

/**
 * BCEconomy – Spigot-Plugin für Lobby, Citybuild usw.
 *
 * Registriert sich als Vault-Economy-Provider und liest/schreibt
 * den Kontostand direkt aus der gemeinsamen MySQL-Tabelle bc_accounts.
 * Kein Cache – immer aktuell, serverübergreifend korrekt.
 *
 * Voraussetzung: Vault muss auf dem Server installiert sein.
 * SurvivalPlus ist NICHT nötig – dieses Plugin ersetzt es für Lobby/Citybuild.
 */
public class BCEconomyPlugin extends JavaPlugin implements Listener {

    private BCDatabase         database;
    private BCEconomyProvider  provider;

    @Override
    public void onEnable() {
        // Config laden / erzeugen
        saveDefaultConfig();

        String host     = getConfig().getString ("mysql.host",           "localhost");
        int    port     = getConfig().getInt    ("mysql.port",           3306);
        String database = getConfig().getString ("mysql.database",       "Survival");
        String user     = getConfig().getString ("mysql.username",       "root");
        String password = getConfig().getString ("mysql.password",       "");

        String currName  = getConfig().getString("economy.currency-name",        "Dollar");
        String currPlural= getConfig().getString("economy.currency-name-plural", "Dollar");
        double startBal  = getConfig().getDouble("economy.start-balance",        500.0);
        int    decimals  = getConfig().getInt   ("economy.decimals",             2);

        // DB verbinden
        this.database = new BCDatabase(getLogger(), host, port, database, user, password);

        if (!this.database.isConnected()) {
            getLogger().severe("[BCEconomy] Keine DB-Verbindung – Plugin wird deaktiviert.");
            Bukkit.getPluginManager().disablePlugin(this);
            return;
        }

        // Vault prüfen
        if (Bukkit.getPluginManager().getPlugin("Vault") == null) {
            getLogger().severe("[BCEconomy] Vault nicht gefunden – Plugin wird deaktiviert.");
            Bukkit.getPluginManager().disablePlugin(this);
            return;
        }

        // Economy-Provider registrieren
        this.provider = new BCEconomyProvider(this.database, currName, currPlural, startBal, decimals);
        getServer().getServicesManager().register(
                Economy.class, this.provider, this, ServicePriority.Highest);

        // Login-Listener: Konto anlegen + Name-Mapping speichern
        Bukkit.getPluginManager().registerEvents(this, this);

        getLogger().info("[BCEconomy] Aktiviert – Vault-Economy verbunden mit " +
                database + "@" + host + ":" + port);
    }

    @Override
    public void onDisable() {
        if (database != null) {
            database.close();
            getLogger().info("[BCEconomy] MySQL-Verbindung geschlossen.");
        }
    }

    /**
     * Bei jedem Login: Konto anlegen (falls neu) und Name speichern.
     * Alles async – kein Blockieren des Main-Threads.
     */
    @EventHandler(priority = EventPriority.MONITOR)
    public void onLogin(PlayerLoginEvent event) {
        if (event.getResult() != PlayerLoginEvent.Result.ALLOWED) return;
        Player player = event.getPlayer();
        Bukkit.getScheduler().runTaskAsynchronously(this, () -> {
            database.saveNameMapping(player.getUniqueId(), player.getName());
            database.createAccountIfAbsent(player.getUniqueId(),
                    getConfig().getDouble("economy.start-balance", 500.0));
        });
    }

    public BCDatabase    getDatabase() { return database; }
    public BCEconomyProvider getProvider() { return provider; }
}
