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

package com.hypixel.hytale.server.worldgen.util.bounds;

import com.hypixel.hytale.math.util.MathUtil;
import javax.annotation.Nonnull;

public class ChunkBounds implements IChunkBounds
{
    protected int minX;
    protected int minZ;
    protected int maxX;
    protected int maxZ;
    
    public ChunkBounds() {
        this(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE);
    }
    
    public ChunkBounds(@Nonnull final IChunkBounds bounds) {
        this(bounds.getLowBoundX(), bounds.getLowBoundZ(), bounds.getHighBoundX(), bounds.getHighBoundZ());
    }
    
    public ChunkBounds(final int minX, final int minZ, final int maxX, final int maxZ) {
        this.minX = minX;
        this.minZ = minZ;
        this.maxX = maxX;
        this.maxZ = maxZ;
    }
    
    public ChunkBounds(final int x, final int z) {
        this.maxX = x;
        this.minX = x;
        this.maxZ = z;
        this.minZ = z;
    }
    
    @Override
    public int getLowBoundX() {
        return this.minX;
    }
    
    @Override
    public int getLowBoundZ() {
        return this.minZ;
    }
    
    @Override
    public int getHighBoundX() {
        return this.maxX;
    }
    
    @Override
    public int getHighBoundZ() {
        return this.maxZ;
    }
    
    public void expandNegative(final int x, final int z) {
        this.minX += x;
        this.minZ += z;
    }
    
    public void expandPositive(final int x, final int z) {
        this.maxX += x;
        this.maxZ += z;
    }
    
    public void expandNegative(final double x, final double z) {
        this.minX = MathUtil.floor(this.minX + x);
        this.minZ = MathUtil.floor(this.minZ + z);
    }
    
    public void expandPositive(final double x, final double z) {
        this.maxX = MathUtil.ceil(this.maxX + x);
        this.maxZ = MathUtil.ceil(this.maxZ + z);
    }
    
    public void include(final int minX, final int minZ, final int maxX, final int maxZ) {
        if (this.minX > minX) {
            this.minX = minX;
        }
        if (this.minZ > minZ) {
            this.minZ = minZ;
        }
        if (this.maxX < maxX) {
            this.maxX = maxX;
        }
        if (this.maxZ < maxZ) {
            this.maxZ = maxZ;
        }
    }
    
    public void include(final int x, final int z) {
        if (this.minX > x) {
            this.minX = x;
        }
        else if (this.maxX < x) {
            this.maxX = x;
        }
        if (this.minZ > z) {
            this.minZ = z;
        }
        else if (this.maxZ < z) {
            this.maxZ = z;
        }
    }
    
    public void include(@Nonnull final IChunkBounds box) {
        if (this.minX > box.getLowBoundX()) {
            this.minX = box.getLowBoundX();
        }
        if (this.minZ > box.getLowBoundZ()) {
            this.minZ = box.getLowBoundZ();
        }
        if (this.maxX < box.getHighBoundX()) {
            this.maxX = box.getHighBoundX();
        }
        if (this.maxZ < box.getHighBoundZ()) {
            this.maxZ = box.getHighBoundZ();
        }
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "ChunkBounds{minX=" + this.minX + ", minZ=" + this.minZ + ", maxX=" + this.maxX + ", maxZ=" + this.maxZ;
    }
}
