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

package com.hypixel.hytale.builtin.hytalegenerator.patterns;

import com.hypixel.hytale.builtin.hytalegenerator.bounds.SpaceSize;
import com.hypixel.hytale.math.vector.Vector3i;
import javax.annotation.Nonnull;

public class CuboidPattern extends Pattern
{
    @Nonnull
    private final Pattern subPattern;
    @Nonnull
    private final Vector3i min;
    @Nonnull
    private final Vector3i max;
    @Nonnull
    private final SpaceSize readSpaceSize;
    
    public CuboidPattern(@Nonnull final Pattern subPattern, @Nonnull final Vector3i min, @Nonnull final Vector3i max) {
        this.subPattern = subPattern;
        this.min = min;
        this.max = max;
        this.readSpaceSize = new SpaceSize(min, max.clone().add(1, 1, 1));
    }
    
    @Override
    public boolean matches(@Nonnull final Context context) {
        final Vector3i scanMin = this.min.clone().add(context.position);
        final Vector3i scanMax = this.max.clone().add(context.position);
        final Vector3i childPosition = context.position.clone();
        final Context childContext = new Context(context);
        childContext.position = childPosition;
        childPosition.x = scanMin.x;
        while (childPosition.x <= scanMax.x) {
            childPosition.z = scanMin.z;
            while (childPosition.z <= scanMax.z) {
                childPosition.y = scanMin.y;
                while (childPosition.y <= scanMax.y) {
                    if (!context.materialSpace.isInsideSpace(childPosition)) {
                        return false;
                    }
                    if (!this.subPattern.matches(childContext)) {
                        return false;
                    }
                    final Vector3i vector3i = childPosition;
                    ++vector3i.y;
                }
                final Vector3i vector3i2 = childPosition;
                ++vector3i2.z;
            }
            final Vector3i vector3i3 = childPosition;
            ++vector3i3.x;
        }
        return true;
    }
    
    @Nonnull
    @Override
    public SpaceSize readSpace() {
        return this.readSpaceSize.clone();
    }
}
