package org.ntlab.radishforandroidstudio.cactusClient.models;

import org.ntlab.radishforandroidstudio.framework.model3D.Model3D;
import org.ntlab.radishforandroidstudio.framework.model3D.Object3D;
import org.ntlab.radishforandroidstudio.framework.model3D.Position3D;
import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D;
import org.ntlab.radishforandroidstudio.framework.physics.AngularVelocity3D;
import org.ntlab.radishforandroidstudio.framework.physics.Velocity3D;
import org.ntlab.radishforandroidstudio.java3d.Box;
import org.ntlab.radishforandroidstudio.java3d.Primitive;

//import framework.model3D.Position3D;
//import framework.physics.AngularVelocity3D;
//import framework.physics.Velocity3D;
import net.arnx.jsonic.JSONHint;

public class Object extends Entity3D {
    private Position3D position;
    private Velocity3D velocity;
    private AngularVelocity3D angularVelocity;
    private Quaternion3D angle;
    private Attribute attribute;
    private Model3D model;
    private Primitive prim;
    private Object3D object;

    @JSONHint(ignore = true)
    public static final int UNIQUE_ID_LENGTH = 12;

    @SuppressWarnings("unused")
    private Object() {
        // JSONDecode時の呼び出し用
    }

    public Object(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity,
                         Quaternion3D angle, Attribute attribute, int modelID) {
        setPrim(new Box());
        setObject(new Object3D("", prim));
        setPlaceable(object);
        setPosition(position);
        setVelocity(velocity);
        setAngularVelocity(angularVelocity);
        setAngle(angle);
        setAttribute(attribute);
        setModel(modelID);
    }

    public Position3D getPosition() {
        return position;
    }

    public Velocity3D getVelocity() {
        return velocity;
    }

    public AngularVelocity3D getAngularVelocity() {
        return angularVelocity;
    }

    public Quaternion3D getAngle() {
        return angle;
    }

    public Attribute getAttribute() {
        return attribute;
    }

    public Model3D getModel() {
        return model;
    }

    public void setPosition(Position3D position) {
        this.position = position;
        ((Object3D)(getPlaceable().getBody())).setPosition(position);
    }

    public void setVelocity(Velocity3D velocity) {
        this.velocity = velocity;
    }

    public void setAngularVelocity(AngularVelocity3D angularVelocity) {
        this.angularVelocity = angularVelocity;
    }

    public void setAngle(Quaternion3D angle) {
        this.angle = angle;
        ((Object3D) getPlaceable().getBody()).apply(angle, false);
    }

    public void setAttribute(Attribute attribute) {
        this.attribute = attribute;
    }

    public void setModel(int modelID) {
        this.model = ObjectModelManager.getInstance().getObject(modelID);
    }

    public static class Attribute {
        private boolean movable; // 可動
        private double cof; // 摩擦係数

        @SuppressWarnings("unused")
        private Attribute() {

        }

        public Attribute(boolean moveable, double cof) {
            setMovable(moveable);
            setCof(cof);
        }

        public boolean isMovable() {
            return movable;
        }

        public double getCof() {
            return cof;
        }

        public void setMovable(boolean moveable) {
            this.movable = moveable;
        }

        public void setCof(double cof) {
            this.cof = cof;
        }
    }

    @JSONHint(ignore = true)
    public Primitive getPrim() {
        return prim;
    }

    public void setPrim(Primitive prim) {
        this.prim = prim;
    }

    @JSONHint(ignore = true)
    public Object3D getObject() {
        return (Object3D) getPlaceable().getBody();
    }

    public void setObject(Object3D object) {
        this.object = object;
    }

}