package WayofTime.alchemicalWizardry.common.renderer.model;

import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;
import net.minecraftforge.common.util.ForgeDirection;


public class ModelSpellEnhancementBlock extends ModelBase
{
  //fields
    ModelRenderer core;
    ModelRenderer frame1;
    ModelRenderer frame2;
    ModelRenderer frame3;
    ModelRenderer frame4;
    ModelRenderer frame5;
    ModelRenderer frame6;
    ModelRenderer frame7;
    ModelRenderer frame8;
    ModelRenderer frame9;
    ModelRenderer frame10;
    ModelRenderer frame11;
    ModelRenderer frame12;
    ModelRenderer outputMain;
    ModelRenderer inputMain;
    ModelRenderer output1;
    ModelRenderer output2;
    ModelRenderer output3;
    ModelRenderer output4;
    ModelRenderer input1;
    ModelRenderer input2;
    ModelRenderer input3;
    ModelRenderer input4;
    ModelRenderer outputSecond;
  
  public ModelSpellEnhancementBlock()
  {
    textureWidth = 128;
    textureHeight = 64;
    
      core = new ModelRenderer(this, 0, 0);
      core.addBox(-3F, -3F, -3F, 6, 6, 6);
      core.setRotationPoint(0F, 16F, 0F);
      core.setTextureSize(128, 64);
      core.mirror = true;
      setRotation(core, 0F, 0F, 0F);
      frame1 = new ModelRenderer(this, 0, 32);
      frame1.addBox(-7F, 5F, -7F, 14, 2, 2);
      frame1.setRotationPoint(0F, 16F, 0F);
      frame1.setTextureSize(128, 64);
      frame1.mirror = true;
      setRotation(frame1, 0F, 0F, 0F);
      frame2 = new ModelRenderer(this, 24, 19);
      frame2.addBox(5F, -5F, -7F, 2, 10, 2);
      frame2.setRotationPoint(0F, 16F, 0F);
      frame2.setTextureSize(128, 64);
      frame2.mirror = true;
      setRotation(frame2, 0F, 0F, 0F);
      frame3 = new ModelRenderer(this, 0, 19);
      frame3.addBox(-7F, -5F, -7F, 2, 10, 2);
      frame3.setRotationPoint(0F, 16F, 0F);
      frame3.setTextureSize(128, 64);
      frame3.mirror = true;
      setRotation(frame3, 0F, 0F, 0F);
      frame4 = new ModelRenderer(this, 0, 14);
      frame4.addBox(-7F, -7F, -7F, 14, 2, 2);
      frame4.setRotationPoint(0F, 16F, 0F);
      frame4.setTextureSize(128, 64);
      frame4.mirror = true;
      setRotation(frame4, 0F, 0F, 0F);
      frame5 = new ModelRenderer(this, 0, 57);
      frame5.addBox(-7F, 5F, 5F, 14, 2, 2);
      frame5.setRotationPoint(0F, 16F, 0F);
      frame5.setTextureSize(128, 64);
      frame5.mirror = true;
      setRotation(frame5, 0F, 0F, 0F);
      frame6 = new ModelRenderer(this, 0, 44);
      frame6.addBox(5F, -5F, 5F, 2, 10, 2);
      frame6.setRotationPoint(0F, 16F, 0F);
      frame6.setTextureSize(128, 64);
      frame6.mirror = true;
      setRotation(frame6, 0F, 0F, 0F);
      frame7 = new ModelRenderer(this, 24, 44);
      frame7.addBox(-7F, -5F, 5F, 2, 10, 2);
      frame7.setRotationPoint(0F, 16F, 0F);
      frame7.setTextureSize(128, 64);
      frame7.mirror = true;
      setRotation(frame7, 0F, 0F, 0F);
      frame8 = new ModelRenderer(this, 0, 39);
      frame8.addBox(-7F, -7F, 5F, 14, 2, 2);
      frame8.setRotationPoint(0F, 16F, 0F);
      frame8.setTextureSize(128, 64);
      frame8.mirror = true;
      setRotation(frame8, 0F, 0F, 0F);
      frame9 = new ModelRenderer(this, 66, 14);
      frame9.addBox(5F, 5F, -5F, 2, 2, 10);
      frame9.setRotationPoint(0F, 16F, 0F);
      frame9.setTextureSize(128, 64);
      frame9.mirror = true;
      setRotation(frame9, 0F, 0F, 0F);
      frame10 = new ModelRenderer(this, 40, 14);
      frame10.addBox(-7F, 5F, -5F, 2, 2, 10);
      frame10.setRotationPoint(0F, 16F, 0F);
      frame10.setTextureSize(128, 64);
      frame10.mirror = true;
      setRotation(frame10, 0F, 0F, 0F);
      frame11 = new ModelRenderer(this, 66, 0);
      frame11.addBox(5F, -7F, -5F, 2, 2, 10);
      frame11.setRotationPoint(0F, 16F, 0F);
      frame11.setTextureSize(128, 64);
      frame11.mirror = true;
      setRotation(frame11, 0F, 0F, 0F);
      frame12 = new ModelRenderer(this, 40, 0);
      frame12.addBox(-7F, -7F, -5F, 2, 2, 10);
      frame12.setRotationPoint(0F, 16F, 0F);
      frame12.setTextureSize(128, 64);
      frame12.mirror = true;
      setRotation(frame12, 0F, 0F, 0F);
      outputMain = new ModelRenderer(this, 78, 36);
      outputMain.addBox(6F, -2F, -2F, 2, 4, 4);
      outputMain.setRotationPoint(0F, 16F, 0F);
      outputMain.setTextureSize(128, 64);
      outputMain.mirror = true;
      setRotation(outputMain, 0F, 0F, 0F);
      inputMain = new ModelRenderer(this, 40, 36);
      inputMain.addBox(-2F, -2F, -8F, 4, 4, 5);
      inputMain.setRotationPoint(0F, 16F, 0F);
      inputMain.setTextureSize(128, 64);
      inputMain.mirror = true;
      setRotation(inputMain, 0F, 0F, 0F);
      output1 = new ModelRenderer(this, 80, 30);
      output1.addBox(5F, -5F, -5F, 3, 2, 2);
      output1.setRotationPoint(0F, 16F, 0F);
      output1.setTextureSize(128, 64);
      output1.mirror = true;
      setRotation(output1, 0F, 0F, 0F);
      output2 = new ModelRenderer(this, 80, 30);
      output2.addBox(5F, -5F, 3F, 3, 2, 2);
      output2.setRotationPoint(0F, 16F, 0F);
      output2.setTextureSize(128, 64);
      output2.mirror = true;
      setRotation(output2, 0F, 0F, 0F);
      output3 = new ModelRenderer(this, 80, 30);
      output3.addBox(5F, 3F, -5F, 3, 2, 2);
      output3.setRotationPoint(0F, 16F, 0F);
      output3.setTextureSize(128, 64);
      output3.mirror = true;
      setRotation(output3, 0F, 0F, 0F);
      output4 = new ModelRenderer(this, 80, 30);
      output4.addBox(5F, 3F, 3F, 3, 2, 2);
      output4.setRotationPoint(0F, 16F, 0F);
      output4.setTextureSize(128, 64);
      output4.mirror = true;
      setRotation(output4, 0F, 0F, 0F);
      input1 = new ModelRenderer(this, 40, 27);
      input1.addBox(3F, -5F, -8F, 2, 2, 5);
      input1.setRotationPoint(0F, 16F, 0F);
      input1.setTextureSize(128, 64);
      input1.mirror = true;
      setRotation(input1, 0F, 0F, 0F);
      input2 = new ModelRenderer(this, 40, 27);
      input2.addBox(-5F, -5F, -8F, 2, 2, 5);
      input2.setRotationPoint(0F, 16F, 0F);
      input2.setTextureSize(128, 64);
      input2.mirror = true;
      setRotation(input2, 0F, 0F, 0F);
      input3 = new ModelRenderer(this, 40, 27);
      input3.addBox(3F, 3F, -8F, 2, 2, 5);
      input3.setRotationPoint(0F, 16F, 0F);
      input3.setTextureSize(128, 64);
      input3.mirror = true;
      setRotation(input3, 0F, 0F, 0F);
      input4 = new ModelRenderer(this, 40, 27);
      input4.addBox(-5F, 3F, -8F, 2, 2, 5);
      input4.setRotationPoint(0F, 16F, 0F);
      input4.setTextureSize(128, 64);
      input4.mirror = true;
      setRotation(input4, 0F, 0F, 0F);
      outputSecond = new ModelRenderer(this, 78, 47);
      outputSecond.addBox(4F, -3F, -3F, 1, 6, 6);
      outputSecond.setRotationPoint(0F, 16F, 0F);
      outputSecond.setTextureSize(128, 64);
      outputSecond.mirror = true;
      setRotation(outputSecond, 0F, 0F, 0F);
  }
  
  public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5, ForgeDirection input, ForgeDirection output)
  {
    super.render(entity, f, f1, f2, f3, f4, f5);
    setRotationAngles(f, f1, f2, f3, f4, f5, entity);
    
    float xInputRot = 0.0f;
    float yInputRot = 0.0f;
    float zInputRot = 0.0f;
    float xOutputRot = 0.0f;
    float yOutputRot = 0.0f;
    float zOutputRot = 0.0f;

    switch (input)
    {
        case NORTH:
            xInputRot = 0.0f;
            yInputRot = 0.0f;
            zInputRot = 0.0f;
            break;

        case EAST:
            xInputRot = 0.0f;
            yInputRot = (float) (0.5f * Math.PI);
            zInputRot = 0.0f;
            break;

        case SOUTH:
            xInputRot = 0.0f;
            yInputRot = (float) (1.0f * Math.PI);
            zInputRot = 0.0f;
            break;

        case WEST:
            xInputRot = 0.0f;
            yInputRot = (float) (-0.5f * Math.PI);
            zInputRot = 0.0f;
            break;

        case UP:
            xInputRot = (float) (-0.5f * Math.PI);
            yInputRot = 0.0f;
            zInputRot = 0.0f;
            break;

        case DOWN:
            xInputRot = (float) (0.5f * Math.PI);
            yInputRot = 0.0f;
            zInputRot = 0.0f;
            break;

        default:
            break;
    }

    switch (output)
    {
        case NORTH:
            xOutputRot = 0.0f;
            yOutputRot = (float) (0.5f * Math.PI);
            zOutputRot = 0.0f;
            break;

        case EAST:
            xOutputRot = 0.0f;
            yOutputRot = (float) (1.0f * Math.PI);
            zOutputRot = 0.0f;
            break;

        case SOUTH:
            xOutputRot = 0.0f;
            yOutputRot = (float) (-0.5f * Math.PI);
            zOutputRot = 0.0f;
            break;

        case WEST:
            xOutputRot = 0.0f;
            yOutputRot = 0.0f;
            zOutputRot = 0.0f;
            break;

        case UP:
            xOutputRot = 0.0f;
            yOutputRot = 0.0f;
            zOutputRot = (float) (-0.5f * Math.PI);
            break;

        case DOWN:
            xOutputRot = 0.0f;
            yOutputRot = 0.0f;
            zOutputRot = (float) (0.5f * Math.PI);
            break;

        default:
            break;
    }

    this.setRotation(inputMain, xInputRot, yInputRot, zInputRot);
    this.setRotation(outputMain, xOutputRot, yOutputRot, zOutputRot);
    this.setRotation(input1, xInputRot, yInputRot, zInputRot);
    this.setRotation(input2, xInputRot, yInputRot, zInputRot);
    this.setRotation(input3, xInputRot, yInputRot, zInputRot);
    this.setRotation(input4, xInputRot, yInputRot, zInputRot);
    this.setRotation(outputSecond, xOutputRot, yOutputRot, zOutputRot);
    this.setRotation(output1, xOutputRot, yOutputRot, zOutputRot);
    this.setRotation(output2, xOutputRot, yOutputRot, zOutputRot);
    this.setRotation(output3, xOutputRot, yOutputRot, zOutputRot);
    this.setRotation(output4, xOutputRot, yOutputRot, zOutputRot);
    
    core.render(f5);
    frame1.render(f5);
    frame2.render(f5);
    frame3.render(f5);
    frame4.render(f5);
    frame5.render(f5);
    frame6.render(f5);
    frame7.render(f5);
    frame8.render(f5);
    frame9.render(f5);
    frame10.render(f5);
    frame11.render(f5);
    frame12.render(f5);
    outputMain.render(f5);
    inputMain.render(f5);
    output1.render(f5);
    output2.render(f5);
    output3.render(f5);
    output4.render(f5);
    input1.render(f5);
    input2.render(f5);
    input3.render(f5);
    input4.render(f5);
    outputSecond.render(f5);
  }
  
  private void setRotation(ModelRenderer model, float x, float y, float z)
  {
    model.rotateAngleX = x;
    model.rotateAngleY = y;
    model.rotateAngleZ = z;
  }
  
  public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity)
  {
    super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);
  }

}