package net.minecraft.util;

public enum Rotation
{
    NONE("rotate_0"),
    CLOCKWISE_90("rotate_90"),
    CLOCKWISE_180("rotate_180"),
    COUNTERCLOCKWISE_90("rotate_270");

    private final String name;
    private static final String[] rotationNames = new String[values().length];

    private Rotation(String nameIn)
    {
        this.name = nameIn;
    }

    public Rotation add(Rotation rotation)
    {
        switch (rotation)
        {
            case CLOCKWISE_180:

                switch (this)
                {
                    case NONE:
                        return CLOCKWISE_180;
                    case CLOCKWISE_90:
                        return COUNTERCLOCKWISE_90;
                    case CLOCKWISE_180:
                        return NONE;
                    case COUNTERCLOCKWISE_90:
                        return CLOCKWISE_90;
                }

            case COUNTERCLOCKWISE_90:

                switch (this)
                {
                    case NONE:
                        return COUNTERCLOCKWISE_90;
                    case CLOCKWISE_90:
                        return NONE;
                    case CLOCKWISE_180:
                        return CLOCKWISE_90;
                    case COUNTERCLOCKWISE_90:
                        return CLOCKWISE_180;
                }

            case CLOCKWISE_90:

                switch (this)
                {
                    case NONE:
                        return CLOCKWISE_90;
                    case CLOCKWISE_90:
                        return CLOCKWISE_180;
                    case CLOCKWISE_180:
                        return COUNTERCLOCKWISE_90;
                    case COUNTERCLOCKWISE_90:
                        return NONE;
                }

            default:
                return this;
        }
    }

    public EnumFacing rotate(EnumFacing facing)
    {
        if (facing.getAxis() == EnumFacing.Axis.Y)
        {
            return facing;
        }
        else
        {
            switch (this)
            {
                case CLOCKWISE_90:
                    return facing.rotateY();
                case CLOCKWISE_180:
                    return facing.getOpposite();
                case COUNTERCLOCKWISE_90:
                    return facing.rotateYCCW();
                default:
                    return facing;
            }
        }
    }

    public int rotate(int p_185833_1_, int p_185833_2_)
    {
        switch (this)
        {
            case CLOCKWISE_90:
                return (p_185833_1_ + p_185833_2_ / 4) % p_185833_2_;
            case CLOCKWISE_180:
                return (p_185833_1_ + p_185833_2_ / 2) % p_185833_2_;
            case COUNTERCLOCKWISE_90:
                return (p_185833_1_ + p_185833_2_ * 3 / 4) % p_185833_2_;
            default:
                return p_185833_1_;
        }
    }

    static
    {
        int i = 0;

        for (Rotation rotation : values())
        {
            rotationNames[i++] = rotation.name;
        }
    }
}