package electroblob.wizardry.client.model;

import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.util.math.MathHelper;

public class ModelPhoenix extends ModelBase {

	ModelRenderer body;
	ModelRenderer rightWing;
	ModelRenderer leftWing;
	ModelRenderer tailFeathers;
	ModelRenderer tail;
	ModelRenderer head;
	ModelRenderer neck;
	ModelRenderer beak;
	ModelRenderer plume;

	public ModelPhoenix(){
		textureWidth = 64;
		textureHeight = 64;

		/* For future reference: - setRotationPoint sets the origin of a part relative to that of its parent. - The
		 * first 3 arguments of addBox set the position of a part relative to its rotation point, and the last 3
		 * arguments are the size of the part. (This means that rotation point and position seem to be the wrong way
		 * round, since changing the rotation point will move the component without changing which point on the
		 * component it rotates about.) - The two integer arguments in the ModelRenderer constructor are the texture
		 * offset. - Mirror does nothing unless you set it before addBox. - Rotation is the usual pitch, yaw, roll. */

		body = new ModelRenderer(this, 0, 34);
		body.addBox(0F, 0F, -3F, 6, 15, 6);
		body.setRotationPoint(-3F, 0F, -5F);
		body.setTextureSize(64, 64);
		body.mirror = true;
		setRotation(body, 0.296706F, 0F, 0F);

		rightWing = new ModelRenderer(this, 0, 0);
		rightWing.mirror = true;
		rightWing.addBox(-27F, -27F, 0F, 27, 34, 0);
		rightWing.setRotationPoint(0F, 5F, 0F);
		rightWing.setTextureSize(64, 64);
		setRotation(rightWing, 0.1745329F, 0F, 0F);

		leftWing = new ModelRenderer(this, 0, 0);
		leftWing.addBox(0F, -27F, 0F, 27, 34, 0);
		leftWing.setRotationPoint(6F, 5F, 0F);
		leftWing.setTextureSize(64, 64);
		setRotation(leftWing, 0.1745329F, 0F, 0F);

		tailFeathers = new ModelRenderer(this, 0, 57);
		tailFeathers.addBox(-5F, 0F, 0F, 10, 7, 0);
		tailFeathers.setRotationPoint(0F, 7F, 1F);
		tailFeathers.setTextureSize(64, 64);
		tailFeathers.mirror = true;
		setRotation(tailFeathers, 0.5235988F, 0F, 0F);

		tail = new ModelRenderer(this, 20, 55);
		tail.addBox(-1F, 0F, -1F, 2, 7, 2);
		tail.setRotationPoint(3F, 15F, 2F);
		tail.setTextureSize(64, 64);
		tail.mirror = true;
		setRotation(tail, 0.4014257F, 0F, 0F);

		head = new ModelRenderer(this, 24, 34);
		head.addBox(-2F, -4F, -5F, 4, 4, 6);
		head.setRotationPoint(0F, -4F, 0F);
		head.setTextureSize(64, 64);
		head.mirror = true;
		setRotation(head, 0F, 0F, 0F);

		neck = new ModelRenderer(this, 24, 44);
		neck.addBox(-1F, -4F, -1F, 2, 4, 2);
		neck.setRotationPoint(0F, 0F, -4F);
		neck.setTextureSize(64, 64);
		neck.mirror = true;
		setRotation(neck, 0.2443461F, 0F, 0F);

		beak = new ModelRenderer(this, 32, 44);
		beak.addBox(-0.5F, 4F, -1F, 1, 2, 3);
		beak.setRotationPoint(0F, -5F, -8F);
		beak.setTextureSize(64, 64);
		beak.mirror = true;
		setRotation(beak, 0.2792527F, 0F, 0F);

		plume = new ModelRenderer(this, 28, 50);
		plume.addBox(-0.03333334F, 1F, 0F, 0, 5, 5);
		plume.setRotationPoint(0F, -7F, 0F);
		plume.setTextureSize(64, 64);
		plume.mirror = true;
		setRotation(plume, 0F, 0F, 0F);

		neck.addChild(head);
		head.addChild(plume);
		head.addChild(beak);
		tail.addChild(tailFeathers);
		body.addChild(tail);
		body.addChild(rightWing);
		body.addChild(leftWing);
	}

	public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5){
		super.render(entity, f, f1, f2, f3, f4, f5);
		setRotationAngles(f, f1, f2, f3, f4, f5, entity);

		// float f6 = (180F / (float)Math.PI);
		this.neck.rotateAngleX = f4 / (180F / (float)Math.PI);
		this.neck.rotateAngleY = f3 / (180F / (float)Math.PI);
		this.neck.rotateAngleZ = 0.0F;
		this.body.rotateAngleX = 0.3f + MathHelper.cos(f2 * 0.1F) * 0.15F;
		this.body.rotateAngleY = 0.0F;
		this.tail.rotateAngleX = this.body.rotateAngleX * 1.1f;
		this.tailFeathers.rotateAngleX = this.body.rotateAngleX * 1.2f;
		this.rightWing.rotateAngleY = MathHelper.cos(f2 * 0.3F) * (float)Math.PI * 0.15F;
		this.leftWing.rotateAngleY = -this.rightWing.rotateAngleY;

		body.render(f5);
		neck.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);
	}

}
