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


package engine.objects;

import engine.gameManager.DbManager;
import engine.math.Vector3f;

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

public class BuildingRegions {


    public static HashMap<Integer, ArrayList<BuildingRegions>> _staticRegions = new HashMap<>();
    private final boolean exitRegion;
    private final boolean stairs;
    public Vector3f center;
    private int buildingID;
    private int level;
    private int numVertex;
    private float vertex1X;
    private float vertex1Y;
    private float vertex1Z;
    private float vertex2X;
    private float vertex2Y;
    private float vertex2Z;
    private float vertex3X;
    private float vertex3Y;
    private float vertex3Z;
    private float vertex4X;
    private float vertex4Y;
    private float vertex4Z;
    private byte ground1;
    private byte ground2;
    private byte ground3;
    private byte ground4;
    private short contentBehavior;
    private boolean outside;
    private float centerX;
    private float centerZ;
    private int room = 0;
    private ArrayList<Vector3f> regionPoints = new ArrayList<>();

    /**
     * ResultSet Constructor
     */

    public BuildingRegions(ResultSet rs) throws SQLException {

        buildingID = rs.getInt("buildingID");
        level = rs.getInt("level");
        room = rs.getInt("room");
        numVertex = rs.getInt("numVertex");
        vertex1X = rs.getFloat("vertex1X");
        vertex1Y = rs.getFloat("vertex1Y");
        vertex1Z = rs.getFloat("vertex1Z");
        vertex2X = rs.getFloat("vertex2X");
        vertex2Y = rs.getFloat("vertex2Y");
        vertex2Z = rs.getFloat("vertex2Z");
        vertex3X = rs.getFloat("vertex3X");
        vertex3Y = rs.getFloat("vertex3Y");
        vertex3Z = rs.getFloat("vertex3Z");
        vertex4X = rs.getFloat("vertex4X");
        vertex4Y = rs.getFloat("vertex4Y");
        vertex4Z = rs.getFloat("vertex4Z");

        regionPoints.add(new Vector3f(vertex1X, vertex1Y, vertex1Z));
        regionPoints.add(new Vector3f(vertex2X, vertex2Y, vertex2Z));
        regionPoints.add(new Vector3f(vertex3X, vertex3Y, vertex3Z));


        if (numVertex == 4)
            regionPoints.add(new Vector3f(vertex4X, vertex4Y, vertex4Z));


        this.contentBehavior = (rs.getShort("unknown_Order1"));
        short state = rs.getShort("unknown_Order2");

        if (state == 2)
            this.outside = (true);
        else
            this.outside = (false);

        this.exitRegion = rs.getBoolean("colOrder1");
        this.stairs = rs.getBoolean("colOrder2");


        ground1 = rs.getByte("colOrder1");
        ground2 = rs.getByte("colOrder2");
        ground3 = rs.getByte("colOrder3");
        ground4 = rs.getByte("colOrder4");

        float centerY = rs.getFloat("unknown_VectorY");
        centerX = rs.getFloat("unknown_VectorX");
        centerZ = rs.getFloat("unknown_VectorZ");

        this.center = new Vector3f(centerX, centerY, centerZ);


    }

    public static HashMap<Integer, ArrayList<BuildingRegions>> get_staticRegions() {
        return _staticRegions;
    }

    public static void set_staticRegions(HashMap<Integer, ArrayList<BuildingRegions>> _staticRegions) {
        BuildingRegions._staticRegions = _staticRegions;
    }

    public static void loadAllStaticColliders() {
        _staticRegions = DbManager.BuildingQueries.LOAD_BUILDING_REGIONS();
    }

    public static ArrayList<BuildingRegions> GetStaticCollidersForMeshID(int meshID) {
        return _staticRegions.get(meshID);
    }

    public int getBuildingID() {
        return buildingID;
    }

    public void setBuildingID(int buildingID) {
        this.buildingID = buildingID;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public int getNumVertex() {
        return numVertex;
    }

    public void setNumVertex(int numVertex) {
        this.numVertex = numVertex;
    }

    public float getVertex1X() {
        return vertex1X;
    }

    public void setVertex1X(float vertex1x) {
        vertex1X = vertex1x;
    }

    public float getVertex1Y() {
        return vertex1Y;
    }

    public void setVertex1Y(float vertex1y) {
        vertex1Y = vertex1y;
    }

    public float getVertex1Z() {
        return vertex1Z;
    }

    public void setVertex1Z(float vertex1z) {
        vertex1Z = vertex1z;
    }

    public float getVertex2X() {
        return vertex2X;
    }

    public void setVertex2X(float vertex2x) {
        vertex2X = vertex2x;
    }

    public float getVertex2Y() {
        return vertex2Y;
    }

    public void setVertex2Y(float vertex2y) {
        vertex2Y = vertex2y;
    }

    public float getVertex2Z() {
        return vertex2Z;
    }

    public void setVertex2Z(float vertex2z) {
        vertex2Z = vertex2z;
    }

    public float getVertex3X() {
        return vertex3X;
    }

    public void setVertex3X(float vertex3x) {
        vertex3X = vertex3x;
    }

    public float getVertex3Y() {
        return vertex3Y;
    }

    public void setVertex3Y(float vertex3y) {
        vertex3Y = vertex3y;
    }

    public float getVertex3Z() {
        return vertex3Z;
    }

    public void setVertex3Z(float vertex3z) {
        vertex3Z = vertex3z;
    }

    public float getVertex4X() {
        return vertex4X;
    }

    public void setVertex4X(float vertex4x) {
        vertex4X = vertex4x;
    }

    public float getVertex4Y() {
        return vertex4Y;
    }

    public void setVertex4Y(float vertex4y) {
        vertex4Y = vertex4y;
    }

    public float getVertex4Z() {
        return vertex4Z;
    }

    public void setVertex4Z(float vertex4z) {
        vertex4Z = vertex4z;
    }

    public boolean isGroundLevel() {
        if (this.level > 0)
            return false;

        if (this.ground1 == 0)
            return true;
        if (this.ground2 == 0)
            return true;
        if (this.ground3 == 0)
            return true;
        return this.ground4 == 0;

    }


    public float getCenterX() {
        return centerX;
    }


    public void setCenterX(float centerX) {
        this.centerX = centerX;
    }


    public float getCenterY() {
        return centerZ;
    }


    public void setCenterY(float centerY) {
        this.centerZ = centerY;
    }


    public boolean isOutside() {
        return outside;
    }

    public short getContentBehavior() {
        return contentBehavior;
    }


    public int getRoom() {
        return room;
    }


    public ArrayList<Vector3f> getRegionPoints() {
        return regionPoints;
    }


    public boolean isExitRegion() {
        return exitRegion;
    }


    public boolean isStairs() {
        return stairs;
    }

}