package visualiser.layout;

import javafx.scene.shape.Shape3D;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Scale;
import javafx.scene.transform.Translate;

/**
 * Wrapper for controlling the position and heading of rendered 3D models.
 */
public class Subject3D {
    /**
     * Rendered mesh
     */
    private Shape3D mesh;
    /**
     * Source ID of subject in game model
     */
    private int sourceID;

    /**
     * Position translation updated by state listeners
     */
    private Translate position;

    /**
     * Heading rotation updated by state listeners
     */
    private Rotate heading;

    private Rotate xRot;

    private Rotate yRot;

    private Scale scale;


    /**
     * Constructor for view subject wrapper
     * @param mesh to be rendered
     * @param sourceID Source ID of the subject.
     */
    public Subject3D(Shape3D mesh, int sourceID) {
        this.mesh = mesh;
        this.sourceID = sourceID;
        this.scale = new Scale();
        this.position = new Translate();
        this.heading = new Rotate(0, Rotate.Y_AXIS);
        this.xRot = new Rotate(90, Rotate.X_AXIS);
        this.yRot = new Rotate(180, Rotate.Y_AXIS);
        this.mesh.getTransforms().addAll(position, scale, heading, xRot, yRot);
    }

    public Shape3D getMesh() {
        return mesh;
    }

    public int getSourceID() {
        return sourceID;
    }

    public Translate getPosition() {
        return this.position;
    }

    public Rotate getHeading() {
        return heading;
    }

    public void setScale(double scale) {
        this.scale.setX(scale);
        this.scale.setY(scale);
        this.scale.setZ(scale);
    }

    public void setX(double x) {
        position.setX(x);
    }

    public void setY(double y) {
        position.setY(y);
    }

    public void setZ(double z) {
        position.setZ(z);
    }

    public void setHeading(double angle) {
        heading.setAngle(angle);
    }

    public void setXRot(double angle){
        xRot.setAngle(angle);
    }

    public void setYRot(double angle){
        yRot.setAngle(angle);
    }
}
