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

package com.hypixel.hytale.math.vector.relative;

import com.hypixel.hytale.codec.validation.Validator;
import java.util.function.Function;
import com.hypixel.hytale.codec.validation.Validators;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.KeyedCodec;
import java.util.Objects;
import javax.annotation.Nullable;
import com.hypixel.hytale.math.vector.Vector3d;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public class RelativeVector3d
{
    @Nonnull
    public static final BuilderCodec<RelativeVector3d> CODEC;
    private Vector3d vector;
    private boolean relative;
    
    public RelativeVector3d(@Nonnull final Vector3d vector, final boolean relative) {
        this.vector = vector;
        this.relative = relative;
    }
    
    protected RelativeVector3d() {
    }
    
    @Nonnull
    public Vector3d getVector() {
        return this.vector;
    }
    
    public boolean isRelative() {
        return this.relative;
    }
    
    @Nonnull
    public Vector3d resolve(@Nonnull final Vector3d vector) {
        return this.relative ? vector.clone().add(vector) : vector.clone();
    }
    
    @Override
    public boolean equals(@Nullable final Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || this.getClass() != o.getClass()) {
            return false;
        }
        final RelativeVector3d that = (RelativeVector3d)o;
        return this.relative == that.relative && Objects.equals(this.vector, that.vector);
    }
    
    @Override
    public int hashCode() {
        int result = (this.vector != null) ? this.vector.hashCode() : 0;
        result = 31 * result + (this.relative ? 1 : 0);
        return result;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "RelativeVector3d{vector=" + String.valueOf(this.vector) + ", relative=" + this.relative;
    }
    
    static {
        CODEC = BuilderCodec.builder(RelativeVector3d.class, RelativeVector3d::new).append(new KeyedCodec<Vector3d>("Vector", Vector3d.CODEC), (o, i) -> o.vector = i, RelativeVector3d::getVector).addValidator(Validators.nonNull()).add().append(new KeyedCodec("Relative", Codec.BOOLEAN), (o, i) -> o.relative = i, RelativeVector3d::isRelative).addValidator(Validators.nonNull()).add().build();
    }
}
