package themixray.repeating.mod.event;

import themixray.repeating.mod.Main;

public class RecordInputEvent extends RecordEvent {
    public Boolean sneaking;
    public Boolean jumping;
    public Boolean pressingForward;
    public Boolean pressingBack;
    public Boolean pressingLeft;
    public Boolean pressingRight;
    public Boolean sprinting;

    public Float movementSideways;
    public Float movementForward;

    public float yaw;
    public float head_yaw;
    public float body_yaw;
    public float pitch;
    public float speed;

    public static RecordInputEvent fromArgs(String[] a) {
        return new RecordInputEvent(
                (a[0].equals("n") ? null : a[0].equals("1")),
                (a[1].equals("n") ? null : a[1].equals("1")),
                (a[2].equals("n") ? null : Float.parseFloat(a[2])),
                (a[3].equals("n") ? null : Float.parseFloat(a[3])),
                (a[4].equals("n") ? null : a[4].equals("1")),
                (a[5].equals("n") ? null : a[5].equals("1")),
                (a[6].equals("n") ? null : a[6].equals("1")),
                (a[7].equals("n") ? null : a[7].equals("1")),
                Float.parseFloat(a[8]), Float.parseFloat(a[9]),
                Float.parseFloat(a[10]),
                (a[11].equals("n") ? null : a[11].equals("1")),
                Float.parseFloat(a[12]),
                Float.parseFloat(a[13]));
    }

    public RecordInputEvent(Boolean sneaking,
                            Boolean jumping,
                            Float movementSideways,
                            Float movementForward,
                            Boolean pressingForward,
                            Boolean pressingBack,
                            Boolean pressingLeft,
                            Boolean pressingRight,
                            float head_yaw,
                            float body_yaw,
                            float head_pitch,
                            Boolean sprinting,
                            float yaw,
                            float speed) {
        this.sneaking = sneaking;
        this.jumping = jumping;
        this.movementSideways = movementSideways;
        this.movementForward = movementForward;
        this.pressingForward = pressingForward;
        this.pressingBack = pressingBack;
        this.pressingLeft = pressingLeft;
        this.pressingRight = pressingRight;
        this.head_yaw = head_yaw;
        this.body_yaw = body_yaw;
        this.pitch = head_pitch;
        this.sprinting = sprinting;
        this.yaw = yaw;
        this.speed = speed;
    }

    public void fillEmpty(RecordInputEvent e) {
        if (sneaking == null) sneaking = e.sneaking;
        if (jumping == null) jumping = e.jumping;
        if (movementSideways == null) movementSideways = e.movementSideways;
        if (movementForward == null) movementForward = e.movementForward;
        if (pressingForward == null) pressingForward = e.pressingForward;
        if (pressingBack == null) pressingBack = e.pressingBack;
        if (pressingLeft == null) pressingLeft = e.pressingLeft;
        if (pressingRight == null) pressingRight = e.pressingRight;
        if (sprinting == null) sprinting = e.sprinting;
    }

    public boolean isEmpty() {
        return sneaking == null &&
                jumping == null &&
                movementSideways == null &&
                movementForward == null &&
                pressingForward == null &&
                pressingBack == null &&
                pressingLeft == null &&
                pressingRight == null &&
                sprinting == null;
    }

    public void replay() {
        Main.input_replay = this;
    }

    public void inputCallback() {
        if (sprinting != null && Main.client.player.isSprinting() != sprinting)
            Main.client.player.setSprinting(sprinting);
        if (Main.client.player.getYaw() != yaw)
            Main.client.player.setYaw(yaw);
        if (Main.client.player.getHeadYaw() != head_yaw)
            Main.client.player.setHeadYaw(head_yaw);
        if (Main.client.player.getBodyYaw() != body_yaw)
            Main.client.player.setBodyYaw(body_yaw);
        if (Main.client.player.getPitch() != pitch)
            Main.client.player.setPitch(pitch);
        if (Main.client.player.getMovementSpeed() != speed)
            Main.client.player.setMovementSpeed(speed);
        if (sneaking != null && Main.client.player.input.sneaking != sneaking)
            Main.client.player.input.sneaking = sneaking;
        if (jumping != null && Main.client.player.input.jumping != jumping)
            Main.client.player.input.jumping = jumping;
        if (movementSideways != null && Main.client.player.input.movementSideways != movementSideways)
            Main.client.player.input.movementSideways = movementSideways;
        if (movementForward != null && Main.client.player.input.movementForward != movementForward)
            Main.client.player.input.movementForward = movementForward;
        if (pressingForward != null && Main.client.player.input.pressingForward != pressingForward)
            Main.client.player.input.pressingForward = pressingForward;
        if (pressingBack != null && Main.client.player.input.pressingBack != pressingBack)
            Main.client.player.input.pressingBack = pressingBack;
        if (pressingLeft != null && Main.client.player.input.pressingLeft != pressingLeft)
            Main.client.player.input.pressingLeft = pressingLeft;
        if (pressingRight != null && Main.client.player.input.pressingRight != pressingRight)
            Main.client.player.input.pressingRight = pressingRight;
    }

    public String serialize() {
        return "p=" +
                ((sneaking == null) ? "n" : (sneaking ? "1" : "0")) + "&" +
                ((jumping == null) ? "n" : (jumping ? "1" : "0")) + "&" +
                ((movementSideways == null) ? "n" : movementSideways) + "&" +
                ((movementForward == null) ? "n" : movementForward) + "&" +
                ((pressingForward == null) ? "n" : (pressingForward ? "1" : "0")) + "&" +
                ((pressingBack == null) ? "n" : (pressingBack ? "1" : "0")) + "&" +
                ((pressingLeft == null) ? "n" : (pressingLeft ? "1" : "0")) + "&" +
                ((pressingRight == null) ? "n" : (pressingRight ? "1" : "0")) + "&" +
                head_yaw + "&" + body_yaw + "&" + pitch + "&" +
                ((sprinting == null) ? "n" : (sprinting ? "1" : "0") +
                        "&" + yaw + "&" + speed);
    }

    public String getType() {
        return "input";
    }
}
