package me.acayrin.nightdrop;

import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.ItemStack;

public class NightDrop extends org.bukkit.plugin.java.JavaPlugin implements org.bukkit.event.Listener
{
  public NightDrop() {}
  
  public void onEnable()
  {
    loadConfiguration();
    long time_from = getConfig().getInt("DropTime.from");
    long time_to = getConfig().getInt("DropTime.to");
    boolean is_enable = getConfig().getBoolean("DropEnable");
    Bukkit.getLogger().info(ChatColor.AQUA + "[NightDrop] Code bởi Acayrin\n\n                                                            \n" + ChatColor.DARK_AQUA + "    o    o o .oPYo.  o    o ooooo ooo.    .oPYo. .oPYo.  .oPYo. \n" + ChatColor.DARK_AQUA + "    8b   8 8 8    8  8    8   8   8  `8.  8   `8 8    8  8    8 \n" + ChatColor.DARK_AQUA + "    8`b  8 8 8      o8oooo8   8   8   `8 o8YooP' 8    8 o8YooP' \n" + ChatColor.DARK_AQUA + "    8 `b 8 8 8   oo  8    8   8   8    8  8   `b 8    8  8      \n" + ChatColor.DARK_AQUA + "    8  `b8 8 8    8  8    8   8   8   .P  8    8 8    8  8      \n" + ChatColor.DARK_AQUA + "    8   `8 8 `YooP8  8    8   8   8ooo'   8    8 `YooP'  8      \n" + ChatColor.DARK_AQUA + "    ..:::....:....8 :..:::..::..::.....:::..:::..:.....::..:::::\n" + ChatColor.DARK_AQUA + "    ::::::::::::::8 ::::::::::::::::::::::::::::::::::::::::::::\n" + ChatColor.DARK_AQUA + "    ::::::::::::::..::::::::::::::::::::::::::::::::::::::::::::\n\n");
    










    Bukkit.getLogger().info(ChatColor.YELLOW + "[NightDrop] Load config: NightMode? " + is_enable + " | Time: " + time_from + " > " + time_to);
    getServer().getPluginManager().registerEvents(this, this);
    if (getConfig().getBoolean("Debug")) {
      int list_configs = 0;
      Bukkit.getLogger().info("Debug: \n");
      for (String configs : getConfig().getConfigurationSection("DropList").getKeys(false)) {
        Bukkit.getLogger().info(configs);
        Bukkit.getLogger().info("  chance: " + getConfig().getInt(new StringBuilder().append("DropList.").append(configs).append(".chance").toString()));
        Bukkit.getLogger().info("  drop: " + getConfig().getInt(new StringBuilder().append("DropList.").append(configs).append(".percent").toString()));
        list_configs++;
      }
      Bukkit.getLogger().info("amount configs: " + list_configs + "\n");
    }
  }
  
  public void onDisable() {
    Bukkit.getLogger().info(ChatColor.RED + "[NightDrop] Shutting down...");
  }
  
  public void loadConfiguration() {
    getConfig().options().copyDefaults(true);
    saveConfig();
  }
  
  public boolean onCommand(org.bukkit.command.CommandSender sender, org.bukkit.command.Command cmd, String label, String[] args) {
    if (cmd.getName().equalsIgnoreCase("nightdrop")) {
      reloadConfig();
      sender.sendMessage(ChatColor.AQUA + "NightDrop by Acayrin - v1.0");
      sender.sendMessage(ChatColor.YELLOW + "Config reloaded!");
      int list_configs = 0;
      Bukkit.getLogger().info("Debug: \n");
      for (String config : getConfig().getConfigurationSection("DropList").getKeys(false)) {
        Bukkit.getLogger().info(config);
        Bukkit.getLogger().info("  chance: " + getConfig().getInt(new StringBuilder().append("DropList.").append(config).append(".chance").toString()));
        Bukkit.getLogger().info("  drop: " + getConfig().getInt(new StringBuilder().append("DropList.").append(config).append(".percent").toString()));
        list_configs++;
      }
      Bukkit.getLogger().info("amount configs: " + list_configs + "\n");
      return true;
    }
    return false;
  }
  

  public final HashMap<String, ItemStack[]> inventory = new HashMap();
  
  @org.bukkit.event.EventHandler
  public void onDeath(PlayerDeathEvent event) { Random random;
    Player player; long time_cur; long time_from; long time_to; if (getConfig().getBoolean("IsEnable")) {
      random = new Random();
      if (event.getEntityType() == org.bukkit.entity.EntityType.PLAYER) {
        player = event.getEntity().getPlayer();
        time_cur = player.getWorld().getTime();
        time_from = getConfig().getInt("DropTime.from");
        time_to = getConfig().getInt("DropTime.to");
        for (String configs : getConfig().getConfigurationSection("DropList").getKeys(false)) {
          if (player.hasPermission("nightdrop." + configs)) {
            if ((time_cur >= time_from) && (time_cur <= time_to)) {
              event.setKeepInventory(true);
            } else {
              List<ItemStack> newInventory = new java.util.ArrayList();
              for (ItemStack item : player.getInventory().getContents()) {
                if (item != null) {
                  int amount = item.getAmount();
                  int rand_number = random.nextInt(100) + 1;
                  if (getConfig().getInt("DropList." + configs + ".chance") == 0) {
                    newInventory.add(new ItemStack(item.getType(), amount));
                    ItemStack[] newStack = (ItemStack[])newInventory.toArray(new ItemStack[newInventory.size()]);
                    inventory.put(player.getName(), newStack);
                  } else if (rand_number <= getConfig().getInt("DropList." + configs + ".chance")) {
                    int drop_mount = amount * getConfig().getInt("DropList." + configs + ".percent") / 100;
                    int keep_mount = amount - drop_mount;
                    newInventory.add(new ItemStack(item.getType(), keep_mount));
                    player.getWorld().dropItem(player.getLocation(), new ItemStack(item.getType(), drop_mount));
                    event.getDrops().clear();
                    ItemStack[] newStack = (ItemStack[])newInventory.toArray(new ItemStack[newInventory.size()]);
                    inventory.put(player.getName(), newStack);
                  }
                }
              }
            }
          }
          else if ((time_cur >= time_from) && (time_cur <= time_to)) {
            event.setKeepInventory(true);
          } else {
            List<ItemStack> newInventory = new java.util.ArrayList();
            for (ItemStack item : player.getInventory().getContents()) {
              if (item != null) {
                int amount = item.getAmount();
                int rand_number = random.nextInt(100) + 1;
                if (getConfig().getInt("DropList.default.chance") == 0) {
                  newInventory.add(new ItemStack(item.getType(), amount));
                  ItemStack[] newStack = (ItemStack[])newInventory.toArray(new ItemStack[newInventory.size()]);
                  inventory.put(player.getName(), newStack);
                } else if (rand_number <= getConfig().getInt("DropList.default.chance")) {
                  int drop_mount = amount * getConfig().getInt("DropList.default.percent") / 100;
                  int keep_mount = amount - drop_mount;
                  newInventory.add(new ItemStack(item.getType(), keep_mount));
                  player.getWorld().dropItem(player.getLocation(), new ItemStack(item.getType(), drop_mount));
                  event.getDrops().clear();
                  ItemStack[] newStack = (ItemStack[])newInventory.toArray(new ItemStack[newInventory.size()]);
                  inventory.put(player.getName(), newStack);
                }
              }
            }
          }
        }
      }
    }
    else {
      event.setKeepInventory(true);
    }
  }
  
  @org.bukkit.event.EventHandler
  public void onRespawn(PlayerRespawnEvent event) {
    if (inventory.containsKey(event.getPlayer().getName())) {
      event.getPlayer().getInventory().setContents((ItemStack[])inventory.get(event.getPlayer().getName()));
      inventory.remove(event.getPlayer().getName());
      event.getPlayer().updateInventory();
      event.getPlayer().closeInventory();
    }
  }
}
