package me.gtacraft.plugins.chests.parser;
import com.google.common.collect.Lists;
import lombok.Getter;
import me.gtacraft.GTAGuns;
import me.gtacraft.api.GTAGunsAPI;
import me.gtacraft.gun.Gun;
import me.gtacraft.gun.GunData;
import me.gtacraft.util.GunUtil;
import me.vaqxine.VNPC.lib.RegionType;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.material.MaterialData;
import java.util.*;
/**
* Created by Connor on 7/4/14. Designed for the GTA-Chests project.
*/
public class ItemData {
private HashMap<String, Object> data = new HashMap<>();
@Getter
private DataTypes.PercentChance chance;
@Getter
private List<RegionType> applicableRegions = Lists.newArrayList();
public ItemData(String loadFrom) {
String[] blowUp = loadFrom.split(",");
for (String scan : blowUp) {
String value = findInsideMap(scan, count(scan, '('));
String key = scan.replace("("+value+")", "");
this.data = loadUp(key, value, this.data);
}
chance = (DataTypes.PercentChance)data.get("percentselect");
applicableRegions = (List<RegionType>)data.get("regiondrop");
if (applicableRegions == null)
applicableRegions = new ArrayList<>();
}
public ItemStack rebuild() {
if (data.containsKey("iscash") && (Boolean)data.get("iscash")) {
LinkedHashMap<DataTypes.PercentChance, DataTypes.RandomRange> ranges = new LinkedHashMap<>();
int at = 1;
double chance = 50;
while (data.containsKey("tier"+at)) {
DataTypes.RandomRange range = (DataTypes.RandomRange)data.get("tier"+at);
ranges.put(new DataTypes.PercentChance(chance), range);
chance/=5;
at++;
}
//select
int pos = 0;
for (DataTypes.PercentChance value : ranges.keySet()) {
++pos;
if (value.didWin(0))
continue;
double cash = ranges.get(value).roll();
ItemStack build = new ItemStack(Material.EMERALD);
ItemMeta meta = build.getItemMeta();
meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&a&l$"+cash));
build.setItemMeta(meta);
return build;
}
return rebuild();
}
if (data.containsKey("isgun") && (Boolean)data.get("isgun")) {
Gun g = GTAGunsAPI.getGunFromName((String) data.get("name"));
GunData fullData = GTAGunsAPI.createData(g);
return fullData.getStack();
}
int amount = 1;
byte _data = (byte)0;
if (data.containsKey("data"))
_data = (Byte)data.get("data");
if (data.containsKey("amount")) {
//parse
Object dat = data.get("amount");
if (dat instanceof DataTypes.RandomRange) {
amount = ((DataTypes.RandomRange) dat).roll();
} else {
amount = (int)(dat);
}
}
ItemStack stack = new ItemStack(Material.getMaterial((Integer)data.get("id")), amount, (short)0, _data);
MaterialData md = stack.getData();
md.setData((data.containsKey("data") ? (Byte)data.get("data") : 0));
stack.setData(md);
if (data.containsKey("name")) {
String name = ChatColor.translateAlternateColorCodes('&', (String) data.get("name"));
ItemMeta im = stack.getItemMeta();
im.setDisplayName(name);
stack.setItemMeta(im);
}
if (data.containsKey("lore")) {
List<String> lore = (List)data.get("lore");
ItemMeta im = stack.getItemMeta();
im.setLore(lore);
stack.setItemMeta(im);
}
if (data.containsKey("enchantments")) {
HashMap<Enchantment, Integer> map = (HashMap)data.get("enchantments");
stack.addUnsafeEnchantments(map);
}
return stack;
}
private static int count(String total, char find) {
int found = 0;
for (char c : total.toCharArray()) {
if (c == find)
found++;
}
return found;
}
private static String findInsideMap(String total, int deep) {
int begin = total.indexOf("(")+1;
int currentDepth = deep;
for (int i = begin; i < total.length(); i++) {
if (total.charAt(i) == ')') {
if (--currentDepth == 0) {
return total.substring(begin, i);
}
}
}
return "";
}
private static HashMap<String, Object> loadUp(String key, String value, HashMap<String, Object> map) {
key = key.toLowerCase();
if (!key.equals("name") && !key.equals("lore"))
value = value.toLowerCase();
if (key.equals("data")) {
map.put(key, Integer.valueOf(value).byteValue());
return map;
}
try { map.put(key, Integer.parseInt(value)); return map; } catch (Exception err) {}
try { map.put(key, Double.parseDouble(value)); return map; } catch (Exception err) {}
if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("false")) {
map.put(key, Boolean.parseBoolean(value));
return map;
}
if (key.equalsIgnoreCase("regiondrop")) {
List<RegionType> applicable = Lists.newArrayList();
for (String parse : value.split("\\-")) {
applicable.add(RegionType.valueOf(parse.toUpperCase()));
}
map.put(key, applicable);
return map;
}
if (value.contains("(")) {
//deeper
String inside = findInsideMap(value, count(value, '('));
if (value.startsWith("from")) {
DataTypes.RandomRange range = new DataTypes.RandomRange(Integer.parseInt(inside.split("-")[0]), Integer.parseInt(inside.split("-")[1]));
map.put(key, range);
return map;
}
} else if (value.contains("%")) {
//is percent
value = value.replace("%", "");
DataTypes.PercentChance pc = new DataTypes.PercentChance(Double.parseDouble(value));
map.put(key, pc);
return map;
} else if (value.contains("|")) {
if (key.startsWith("enchantments")) {
HashMap<Enchantment, Integer> enchMap = new HashMap<>();
String[] $1 = value.split("[\\|]");
for (String s : $1) {
enchMap.put(Enchantment.getById(Integer.parseInt(s.split("[\\-]")[0])), Integer.parseInt(s.split("[\\-]")[1]));
}
map.put(key, enchMap);
return map;
} else if (key.startsWith("lore")) {
List<String> lore = Lists.newArrayList();
for (String s : value.split("[\\|]")) {
lore.add(ChatColor.translateAlternateColorCodes('&', s));
}
map.put(key, lore);
return map;
}
}
map.put(key, value);
return map;
}
}