// 
// 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.Vector2i;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public class RelativeVector2i
{
    @Nonnull
    public static final BuilderCodec<RelativeVector2i> CODEC;
    private Vector2i vector;
    private boolean relative;
    
    public RelativeVector2i(@Nonnull final Vector2i vector, final boolean relative) {
        this.vector = vector;
        this.relative = relative;
    }
    
    protected RelativeVector2i() {
    }
    
    @Nonnull
    public Vector2i getVector() {
        return this.vector;
    }
    
    public boolean isRelative() {
        return this.relative;
    }
    
    @Nonnull
    public Vector2i resolve(@Nonnull final Vector2i 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 RelativeVector2i that = (RelativeVector2i)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 "RelativeVector2i{vector=" + String.valueOf(this.vector) + ", relative=" + this.relative;
    }
    
    static {
        CODEC = BuilderCodec.builder(RelativeVector2i.class, RelativeVector2i::new).append(new KeyedCodec<Vector2i>("Vector", Vector2i.CODEC), (o, i) -> o.vector = i, RelativeVector2i::getVector).addValidator(Validators.nonNull()).add().append(new KeyedCodec("Relative", Codec.BOOLEAN), (o, i) -> o.relative = i, RelativeVector2i::isRelative).addValidator(Validators.nonNull()).add().build();
    }
}
