* Copyright (C) 2014-2016  EbonJaguar
 *     This program is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU General Public License as published by
 *     the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 *     This program is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     GNU General Public License for more details.
 *     You should have received a copy of the GNU General Public License
 *     along with this program.  If not, see <http://www.gnu.org/licenses/>.

package me.gnat008.perworldinventory.data.serializers;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import me.gnat008.perworldinventory.ConsoleLogger;
import me.gnat008.perworldinventory.data.players.PWIPlayer;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;

import javax.inject.Inject;

public class InventorySerializer {

    private ItemSerializer itemSerializer;

    InventorySerializer() {}

     * Serialize a PlayerInventory. This will save the armor contents of the inventory as well
     * @param player The player to serialize
     * @return A JsonObject representing the serialized Inventory.
    public JsonObject serializePlayerInventory(PWIPlayer player) {
        JsonObject root = new JsonObject();
        JsonArray inventory = serializeInventory(player.getInventory());
        JsonArray armor = serializeInventory(player.getArmor());

        root.add("inventory", inventory);
        root.add("armor", armor);

        return root;

     * Serialize an ItemStack array.
     * @param contents The items in the inventory
     * @return A JsonArray representing the serialized ItemStack array
    public JsonArray serializeInventory(ItemStack[] contents) {
        JsonArray inventory = new JsonArray();

        for (int i = 0; i < contents.length; i++) {
            JsonObject values = itemSerializer.serializeItem(contents[i], i);
            if (values != null)

        return inventory;

     * Sets the Inventory using an ItemStack array constructed from a JsonObject.
     * @param player The InventoryHolder to which the Inventory will be set
     * @param inv    The reference JsonArray
     * @param format Data format being used; 0 is old, 1 is new
    public void setInventory(Player player, JsonObject inv, int format) {
        PlayerInventory inventory = player.getInventory();
        ItemStack[] armor = deserializeInventory(inv.getAsJsonArray("armor"), 4, format);
        ItemStack[] inventoryContents = deserializeInventory(inv.getAsJsonArray("inventory"), inventory.getSize(), format);

        if (armor != null) {
        if (inventoryContents != null) {

     * Gets an ItemStack array from a JsonObject.
     * @param inv  The JsonObject to get from
     * @param size The expected size of the inventory, can be greater than expected
     * @param format Data format being used; 0 is old, 1 is new
     * @return An ItemStack array constructed from the given JsonArray
    public ItemStack[] deserializeInventory(JsonArray inv, int size, int format) {
    	// Be tolerant if the expected JsonArray tag is missing
    	if (inv == null) {
    		return null;
        ItemStack[] contents = new ItemStack[size];
        for (int i = 0; i < inv.size(); i++) {
        	// We don't want to risk failing to deserialize a players inventory. Try your best
        	// to deserialize as much as possible.
        	try {
	            JsonObject item = inv.get(i).getAsJsonObject();
	            int index = item.get("index").getAsInt();
	            ItemStack is = itemSerializer.deserializeItem(item, format);
	            contents[index] = is;
        	catch (Exception ex) {
                ConsoleLogger.warning("Failed to deserialize inventory:", ex);

        return contents;