// • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
// ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
//      Magicbane Emulator Project © 2013 - 2022
//                www.magicbane.com


package engine.objects;

import engine.gameManager.BuildingManager;
import engine.gameManager.DbManager;
import engine.math.Quaternion;
import engine.math.Vector3fImmutable;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;


public class BuildingLocation extends AbstractGameObject {

    private final int buildingUUID;
    private final int type;
    private final int slot;
    private final int unknown;
    private final Vector3fImmutable location;
    private final Quaternion rotation;


    public BuildingLocation() {

        this.buildingUUID = 0;
        this.type = 0;
        this.slot = 0;
        this.unknown = 0;
        this.location = Vector3fImmutable.ZERO;
        this.rotation = new Quaternion();
    }

    /**
     * ResultSet Constructor
     */
    public BuildingLocation(ResultSet rs) throws SQLException {
        super(rs);
        this.buildingUUID = rs.getInt("BuildingID");
        this.type = rs.getInt("type");
        this.slot = rs.getInt("slot");
        this.unknown = rs.getInt("unknown");
        this.location = new Vector3fImmutable(rs.getFloat("locX"), rs.getFloat("locY"), rs.getFloat("locZ"));
        this.rotation = new Quaternion(rs.getFloat("rotX"), rs.getFloat("rotY"), rs.getFloat("rotZ"), rs.getFloat("w"));
    }

    /*
     * Getters
     */

    public static void loadBuildingLocations() {

        ArrayList<BuildingLocation> buildingLocations = DbManager.BuildingLocationQueries.LOAD_BUILDING_LOCATIONS();
        HashMap<Integer, ArrayList<BuildingLocation>> locationCollection = new HashMap<>();

        // Only slot locations and stuck locations are currently loaded.

        for (BuildingLocation buildingLocation : buildingLocations) {

            switch (buildingLocation.type) {
                case 6:
                    locationCollection = BuildingManager._slotLocations;
                    break;
                case 8:
                    locationCollection = BuildingManager._stuckLocations;
                    break;
            }

            // Add location to collection in BuildingManager

            if (locationCollection.containsKey(buildingLocation.buildingUUID))
                locationCollection.get(buildingLocation.buildingUUID).add(buildingLocation);
            else {
                locationCollection.put(buildingLocation.buildingUUID, new ArrayList<>());
                locationCollection.get(buildingLocation.buildingUUID).add(buildingLocation);
            }

        }
    }

    public int getBuildingUUID() {
        return this.buildingUUID;
    }

    public int getType() {
        return this.type;
    }

    public int getSlot() {
        return this.slot;
    }

    public int getUnknown() {
        return this.unknown;
    }

    public float getLocX() {
        return this.location.x;
    }

    public float getLocY() {
        return this.location.y;
    }

    public Vector3fImmutable getLocation() {
        return this.location;
    }

    public Quaternion getRotation() {
        return this.rotation;
    }

    @Override
    public void updateDatabase() {
    }

}