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

package com.hypixel.hytale.builtin.hytalegenerator.props.directionality;

import com.hypixel.hytale.math.util.FastRandom;
import java.util.ArrayList;
import com.hypixel.hytale.math.vector.Vector3i;
import com.hypixel.hytale.builtin.hytalegenerator.scanners.Scanner;
import java.util.Collections;
import com.hypixel.hytale.builtin.hytalegenerator.patterns.OrPattern;
import com.hypixel.hytale.builtin.hytalegenerator.framework.math.SeedGenerator;
import com.hypixel.hytale.builtin.hytalegenerator.patterns.Pattern;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.prefab.PrefabRotation;
import java.util.List;

public class PatternDirectionality extends Directionality
{
    @Nonnull
    private final List<PrefabRotation> rotations;
    @Nonnull
    private final PrefabRotation south;
    @Nonnull
    private final PrefabRotation north;
    @Nonnull
    private final PrefabRotation east;
    @Nonnull
    private final PrefabRotation west;
    @Nonnull
    private final Pattern southPattern;
    @Nonnull
    private final Pattern northPattern;
    @Nonnull
    private final Pattern eastPattern;
    @Nonnull
    private final Pattern westPattern;
    @Nonnull
    private final Pattern generalPattern;
    @Nonnull
    private final SeedGenerator seedGenerator;
    
    public PatternDirectionality(@Nonnull final OrthogonalDirection startingDirection, @Nonnull final Pattern southPattern, @Nonnull final Pattern northPattern, @Nonnull final Pattern eastPattern, @Nonnull final Pattern westPattern, final int seed) {
        this.southPattern = southPattern;
        this.northPattern = northPattern;
        this.eastPattern = eastPattern;
        this.westPattern = westPattern;
        this.generalPattern = new OrPattern(List.of(northPattern, southPattern, eastPattern, westPattern));
        this.seedGenerator = new SeedGenerator(seed);
        switch (startingDirection) {
            default: {
                this.north = PrefabRotation.ROTATION_0;
                this.east = PrefabRotation.ROTATION_270;
                this.south = PrefabRotation.ROTATION_180;
                this.west = PrefabRotation.ROTATION_90;
                break;
            }
            case S: {
                this.south = PrefabRotation.ROTATION_0;
                this.west = PrefabRotation.ROTATION_270;
                this.north = PrefabRotation.ROTATION_180;
                this.east = PrefabRotation.ROTATION_90;
                break;
            }
            case E: {
                this.east = PrefabRotation.ROTATION_180;
                this.south = PrefabRotation.ROTATION_90;
                this.west = PrefabRotation.ROTATION_0;
                this.north = PrefabRotation.ROTATION_270;
                break;
            }
            case W: {
                this.west = PrefabRotation.ROTATION_180;
                this.north = PrefabRotation.ROTATION_90;
                this.east = PrefabRotation.ROTATION_0;
                this.south = PrefabRotation.ROTATION_270;
                break;
            }
        }
        this.rotations = Collections.unmodifiableList((List<? extends PrefabRotation>)List.of(this.north, this.south, this.east, this.west));
    }
    
    @Nonnull
    @Override
    public Pattern getGeneralPattern() {
        return this.generalPattern;
    }
    
    @Nonnull
    @Override
    public Vector3i getReadRangeWith(@Nonnull final Scanner scanner) {
        return scanner.readSpaceWith(this.generalPattern).getRange();
    }
    
    @Nonnull
    @Override
    public List<PrefabRotation> getPossibleRotations() {
        return this.rotations;
    }
    
    @Override
    public PrefabRotation getRotationAt(@Nonnull final Pattern.Context context) {
        final ArrayList<PrefabRotation> successful = new ArrayList<PrefabRotation>(4);
        if (this.northPattern.matches(context)) {
            successful.add(this.north);
        }
        if (this.southPattern.matches(context)) {
            successful.add(this.south);
        }
        if (this.eastPattern.matches(context)) {
            successful.add(this.east);
        }
        if (this.westPattern.matches(context)) {
            successful.add(this.west);
        }
        if (successful.isEmpty()) {
            return null;
        }
        final FastRandom random = new FastRandom(this.seedGenerator.seedAt(context.position.x, context.position.y, context.position.z));
        return successful.get(random.nextInt(successful.size()));
    }
}
