package com.gmail.nuclearcat1337.vaultPlugin;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.gmail.nuclearcat1337.anniPro.voting.ConfigManager;
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;

import net.milkbowl.vault.economy.Economy;

import com.gmail.nuclearcat1337.anniPro.main.AnnihilationMain;
import com.gmail.nuclearcat1337.anniPro.utils.Perm;

public class VaultHook extends JavaPlugin
{
	private Economy econ;

    private YamlConfiguration config;
    private File configFile;
	private List<Perm> perms;
	
	@Override
	public void onEnable()
	{
		if(!verifyEcon())
        {
            Bukkit.getLogger().info("[AnnihilationVault] Error! Could not hook into vault");
            Bukkit.getPluginManager().disablePlugin(this);
        }

        Bukkit.getLogger().info("[AnnihilationVault] Successfully hooked into Vault");
        configFile = new File(AnnihilationMain.getInstance().getDataFolder().getAbsolutePath(),"AnnihilationVaultConfig.yml");
        checkFile(configFile);
        config = YamlConfiguration.loadConfiguration(configFile);

        int x = 0;
        x += ConfigManager.setDefaultIfNotSet(config, "Nexus-Hit-Money", 1.00D);
        x += ConfigManager.setDefaultIfNotSet(config, "Player-Kill-Money", 3.00D);
        x += ConfigManager.setDefaultIfNotSet(config, "Winning-Team-Money", 100.00D);
        x += ConfigManager.setDefaultIfNotSet(config, "Second-Place-Team-Money", 75.00D);
        x += ConfigManager.setDefaultIfNotSet(config, "Third-Place-Team-Money", 50.00D);
        x += ConfigManager.setDefaultIfNotSet(config, "Last-Place-Team-Money", 25.00D);
        x += ConfigManager.setDefaultIfNotSet(config, "Gave-Money-Message", "&a+%# Annihilation XP");
        if(!config.isConfigurationSection("Money-Multipliers"))
        {
            ConfigurationSection multipliers = config.createSection("Money-Multipliers");
            multipliers.set("Multiplier-1.Permission", "Anni.Money.2");
            multipliers.set("Multiplier-1.Multiplier", 2);
            x++;
        }

        if(x > 0)
            saveConfig();

        loadMultipliers(config.getConfigurationSection("Money-Multipliers"));
        loadXPVars(config);

        //AnniEvent.registerListener(this);
        //Bukkit.getPluginManager().registerEvents(this, this);
	}
	
	private boolean verifyEcon()
	{
		if(Bukkit.getPluginManager().getPlugin("Vault") == null) 
			return false;
		//Bukkit.getLogger().info("Here 1");
		RegisteredServiceProvider<Economy> rsp = Bukkit.getServicesManager().getRegistration(Economy.class);
		if (rsp == null) 
		    return false;
		//Bukkit.getLogger().info("Here 2");
		econ = rsp.getProvider();
		//Bukkit.getLogger().info("Here 3");
		return econ != null;
	}

    private void checkFile(File file)
    {
        if(!file.exists())
        {
            try
            {
                file.createNewFile();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    public void saveConfig()
    {
        try
        {
            config.save(configFile);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    public EconomyResponse giveMoney(Player player, double amount)
    {
        return econ.depositPlayer(player,amount);
    }

    private void loadXPVars(ConfigurationSection section)
    {
        assert section != null;

        double nexusHitXP = section.getDouble("Nexus-Hit-Money");
        double killXP = section.getDouble("Player-Kill-Money");
        String gaveXPMessage = section.getString("Gave-Money-Message");
        double[] teamXPs = new double[4];
        teamXPs[0] = section.getDouble("Winning-Team-Money");
        teamXPs[1] = section.getDouble("Second-Place-Team-Money");
        teamXPs[2] = section.getDouble("Third-Place-Team-Money");
        teamXPs[3] = section.getDouble("Last-Place-Team-Money");

        Listeners listeners = new Listeners(this,gaveXPMessage,killXP,nexusHitXP,teamXPs);
        Bukkit.getPluginManager().registerEvents(listeners,this);
    }

    private void loadMultipliers(ConfigurationSection multipliers)
    {
        assert multipliers != null;
        perms = new ArrayList<Perm>();
        //ConfigurationSection multipliers = config.getConfigurationSection("XP-Multipliers");
        //if(multipliers != null)
       // {
            for(String key : multipliers.getKeys(false))
            {
                ConfigurationSection multSec = multipliers.getConfigurationSection(key);
                String perm = multSec.getString("Permission");
                int multiplier = multSec.getInt("Multiplier");
                if(perm != null && !perm.equals("") && multiplier > 0)
                {
                    Permission p = new Permission(perm);
                    p.setDefault(PermissionDefault.FALSE);
                    Bukkit.getPluginManager().addPermission(p);
                    p.recalculatePermissibles();
                    perms.add(new Perm(perm,multiplier));
                }
            }
            Collections.sort(perms);
        //}
    }

    public double checkMultipliers(Player player, double initialXP)
	{
		if(perms.size() > 0)
		{
			//Bukkit.getLogger().info("Greater than zero");
			for(Perm p : perms)
			{
				//Bukkit.getLogger().info("Checking perm: "+p.perm);
				if(player.hasPermission(p.perm))
				{
					//Bukkit.getLogger().info("Player has perm: "+p.perm);
					initialXP = initialXP*p.multiplier;
					break;
				}
			}
		}
		return initialXP;
	}
}