// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.math.vector;

import javax.annotation.Nonnull;

public class Vector4d
{
    public static final int COMPONENT_X = 0;
    public static final int COMPONENT_Y = 1;
    public static final int COMPONENT_Z = 2;
    public static final int COMPONENT_W = 3;
    public double x;
    public double y;
    public double z;
    public double w;
    
    public Vector4d() {
        this(0.0, 0.0, 0.0, 0.0);
    }
    
    public Vector4d(final double x, final double y, final double z, final double w) {
        this.x = x;
        this.y = y;
        this.z = z;
        this.w = w;
    }
    
    @Nonnull
    public static Vector4d newPosition(final double x, final double y, final double z) {
        return new Vector4d(x, y, z, 1.0);
    }
    
    @Nonnull
    public static Vector4d newPosition(@Nonnull final Vector3d v) {
        return new Vector4d(v.x, v.y, v.z, 1.0);
    }
    
    @Nonnull
    public static Vector4d newDirection(final double x, final double y, final double z) {
        return new Vector4d(x, y, z, 0.0);
    }
    
    @Nonnull
    public Vector4d setDirection() {
        this.w = 0.0;
        return this;
    }
    
    @Nonnull
    public Vector4d setPosition() {
        this.w = 1.0;
        return this;
    }
    
    @Nonnull
    public Vector4d assign(@Nonnull final Vector4d v) {
        return this.assign(v.x, v.y, v.z, v.w);
    }
    
    @Nonnull
    public Vector4d assign(final double x, final double y, final double z, final double w) {
        this.x = x;
        this.y = y;
        this.z = z;
        this.w = w;
        return this;
    }
    
    @Nonnull
    public Vector4d lerp(@Nonnull final Vector4d dest, final double lerpFactor, @Nonnull final Vector4d target) {
        target.assign((dest.x - this.x) * lerpFactor + this.x, (dest.y - this.y) * lerpFactor + this.y, (dest.z - this.z) * lerpFactor + this.z, (dest.w - this.w) * lerpFactor + this.w);
        return target;
    }
    
    public void perspectiveTransform() {
        final double invW = 1.0 / this.w;
        this.x *= invW;
        this.y *= invW;
        this.z *= invW;
        this.w = 1.0;
    }
    
    public boolean isInsideFrustum() {
        return Math.abs(this.x) <= Math.abs(this.w) && Math.abs(this.y) <= Math.abs(this.w) && Math.abs(this.z) <= Math.abs(this.w);
    }
    
    public double get(final int component) {
        return switch (component) {
            case 0 -> this.x;
            case 1 -> this.y;
            case 2 -> this.z;
            case 3 -> this.w;
            default -> throw new IllegalArgumentException("Invalid component: " + component);
        };
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "Vector4d{x=" + this.x + ", y=" + this.y + ", z=" + this.z + ", w=" + this.w;
    }
}
