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

package com.hypixel.hytale.server.core.universe.world.chunk;

import com.hypixel.hytale.server.core.asset.type.blocktype.config.Rotation;
import com.hypixel.hytale.server.core.asset.type.blocktype.config.VariantRotation;
import com.hypixel.hytale.math.Axis;
import javax.annotation.Nullable;
import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockFlipType;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.asset.type.blocktype.config.RotationTuple;

public class BlockRotationUtil
{
    @Nullable
    public static RotationTuple getFlipped(@Nonnull final RotationTuple blockRotation, @Nullable final BlockFlipType flipType, @Nonnull final Axis axis, @Nonnull final VariantRotation variantRotation) {
        Rotation rotationYaw = blockRotation.yaw();
        final Rotation rotationPitch = blockRotation.pitch();
        final Rotation rotationRoll = blockRotation.roll();
        if (flipType != null) {
            rotationYaw = flipType.flipYaw(rotationYaw, axis);
        }
        final boolean preventPitchRotation = axis != Axis.Y;
        return get(rotationYaw, rotationPitch, rotationRoll, axis, Rotation.OneEighty, variantRotation, preventPitchRotation);
    }
    
    @Nullable
    public static RotationTuple getRotated(@Nonnull final RotationTuple blockRotation, @Nonnull final Axis axis, final Rotation rotation, @Nonnull final VariantRotation variantRotation) {
        return get(blockRotation.yaw(), blockRotation.pitch(), blockRotation.roll(), axis, rotation, variantRotation, false);
    }
    
    @Nullable
    private static RotationTuple get(@Nonnull final Rotation rotationYaw, @Nonnull final Rotation rotationPitch, @Nonnull final Rotation rotationRoll, @Nonnull final Axis axis, final Rotation rotation, @Nonnull final VariantRotation variantRotation, final boolean preventPitchRotation) {
        RotationTuple rotationPair = null;
        switch (axis) {
            case X: {
                final RotationTuple rotateX = variantRotation.rotateX(RotationTuple.of(rotationYaw, rotationPitch), rotation);
                rotationPair = variantRotation.verify(rotateX);
                break;
            }
            case Y: {
                rotationPair = variantRotation.verify(RotationTuple.of(rotationYaw.add(rotation), rotationPitch));
                break;
            }
            case Z: {
                final RotationTuple rotateZ = variantRotation.rotateZ(RotationTuple.of(rotationYaw, rotationPitch), rotation);
                rotationPair = variantRotation.verify(rotateZ);
                break;
            }
        }
        if (rotationPair == null) {
            return null;
        }
        if (preventPitchRotation) {
            rotationPair = RotationTuple.of(rotationPair.yaw(), rotationPitch);
        }
        return rotationPair;
    }
    
    public static int getFlippedFiller(final int filler, @Nonnull final Axis axis) {
        return getRotatedFiller(filler, axis, Rotation.OneEighty);
    }
    
    public static int getRotatedFiller(final int filler, @Nonnull final Axis axis, final Rotation rotation) {
        return switch (axis) {
            default -> throw new MatchException(null, null);
            case X -> rotation.rotateX(filler);
            case Y -> rotation.rotateY(filler);
            case Z -> rotation.rotateZ(filler);
        };
    }
}
