package net.glowstone.io.structure;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import net.glowstone.GlowWorld;
import net.glowstone.generator.structures.GlowStructure;
import net.glowstone.generator.structures.GlowStructurePiece;
import net.glowstone.generator.structures.util.StructureBoundingBox;
import net.glowstone.util.nbt.CompoundTag;
import net.glowstone.util.nbt.TagType;
import org.bukkit.util.Vector;

/**
 * The base for structure store classes.
 *
 * @param <T> The type of structure being stored.
 */
public abstract class StructureStore<T extends GlowStructure> {

    private final String id;
    private final Class<T> clazz;

    public StructureStore(Class<T> clazz, String id) {
        this.id = id;
        this.clazz = clazz;
    }

    public final String getId() {
        return id;
    }

    public final Class<T> getType() {
        return clazz;
    }

    /**
     * Create a structure of this store's type in the given world. The load method will be called separately.
     *
     * @param world The target world.
     * @param chunkX The structure chunk X.
     * @param chunkZ The structure chunk Z.
     * @return The structure.
     */
    public abstract T createStructure(GlowWorld world, int chunkX, int chunkZ);

    /**
     * Create a new structure of this store's type in the given world. The load method will be called separately.
     *
     * @param world The target world.
     * @param random The seeded random.
     * @param chunkX The structure chunk X.
     * @param chunkZ The structure chunk Z.
     * @return The new structure.
     */
    public abstract T createNewStructure(GlowWorld world, Random random, int chunkX, int chunkZ);

    /**
     * Load structure data of the appropriate type from the given compound tag.
     *
     * @param structure The target structure.
     * @param compound The structure's tag.
     */
    public void load(T structure, CompoundTag compound) {
        if (compound.isIntArray("BB")) {
            int[] bb = compound.getIntArray("BB");
            if (bb.length == 6) {
                StructureBoundingBox boundingBox = new StructureBoundingBox(
                    new Vector(bb[0], bb[1], bb[2]), new Vector(bb[3], bb[4], bb[5]));
                structure.setBoundingBox(boundingBox);
            }
        }
        if (compound.isList("Children", TagType.COMPOUND)) {
            for (CompoundTag tag : compound.getCompoundList("Children")) {
                structure.addPiece(StructurePieceStorage.loadStructurePiece(tag));
            }
        }
    }

    /**
     * Save information about this structure to the given tag.
     *
     * @param structure The structure to save.
     * @param compound The target tag.
     */
    public void save(T structure, CompoundTag compound) {
        StructureBoundingBox boundingBox = structure.getBoundingBox();
        int[] bb = new int[6];
        bb[0] = boundingBox.getMin().getBlockX();
        bb[1] = boundingBox.getMin().getBlockY();
        bb[2] = boundingBox.getMin().getBlockZ();
        bb[3] = boundingBox.getMax().getBlockX();
        bb[4] = boundingBox.getMax().getBlockY();
        bb[5] = boundingBox.getMax().getBlockZ();
        compound.putIntArray("BB", bb);
        List<CompoundTag> children = new ArrayList<>();
        for (GlowStructurePiece piece : structure.getPieces()) {
            CompoundTag tag = new CompoundTag();
            StructurePieceStorage.saveStructurePiece(piece, tag);
            children.add(tag);
        }
        compound.putCompoundList("Children", children);
    }
}

@@ -1007,32 +1007,39 @@
 d will be called
+%0A     *
  separately.%0A   
@@ -1385,24 +1385,31 @@
 thod will be
+%0A     *
  called sepa
@@ -2184,16 +2184,20 @@
 ingBox(%0A
+    
         

Fix CheckStyle issues in io/structure/StructureStore.java (#766)