/*
 *  rotation.cpp
 *  Untitled
 *
 *  Created by Lionel BUCHELE on 05/04/11.
 *  Copyright 2011 EFREI. All rights reserved.
 *
 */
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include "Buchele-Thebault-rotation.h"

void RotationD(pcote face)
{
	int tableau[3][3];
	int i; int y;
	for(i = 0; i<=2; i++)for(y = 0;y<=2;y++)tableau[i][y] = face->cases[i][y];
	face->cases[0][0] = tableau[0][2];
	face->cases[0][1] = tableau[1][2];
	face->cases[0][2] = tableau[2][2];
	face->cases[1][0] = tableau[0][1];
	face->cases[1][2] = tableau[2][1];
	face->cases[2][0] = tableau[0][0];
	face->cases[2][1] = tableau[1][0];
	face->cases[2][2] = tableau[2][0];
}

void RotationG(pcote face)
{
	int tableau[3][3];
	int i; int y;
	for(i = 0; i<=2; i++)for(y = 0;y<=2;y++)tableau[i][y] = face->cases[i][y];
	face->cases[0][0] = tableau[2][0];
	face->cases[0][1] = tableau[1][0];
	face->cases[0][2] = tableau[0][0];
	face->cases[1][0] = tableau[2][1];
	face->cases[1][2] = tableau[0][1];
	face->cases[2][0] = tableau[2][2];
	face->cases[2][1] = tableau[1][2];
	face->cases[2][2] = tableau[0][2];
}

//Rotation haut horaire
void pivothaut(pcote face, int quelface, int *save, int index)
{
	if(index == 3){free(save);return;}
	if((quelface == 1)||(quelface == 3)||(quelface==5)||(quelface==6))
	{
		//printf("index ix %d\n", index);
		if(quelface == face->name)
		{
			//Preparation de la rotation vers le haut
			save = (int*)malloc(sizeof(int)*3);
			save[0] = face->gauche->cases[0][0];
			save[1] = face->gauche->cases[0][1]; 
			save[2] = face->gauche->cases[0][2]; 
			face->gauche->cases[0][0] = face->cases[0][0];
			face->gauche->cases[0][1] = face->cases[0][1];
			face->gauche->cases[0][2] = face->cases[0][2];
			face->cases[0][0] = face->droite->cases[0][0];
			face->cases[0][1] = face->droite->cases[0][1];
			face->cases[0][2] = face->droite->cases[0][2];
			
			//Modification de la face a gauche
			RotationG(face->haut);
			index++;
			pivothaut(face->gauche,quelface,save,index);
		}
		else if(index==1)
		{
			int saveUn = 0; int saveDeux = 0; int saveTrois = 0; 
			saveUn =face->gauche->cases[2][0];
			saveDeux = face->gauche->cases[2][1];
			saveTrois = face->gauche->cases[2][2];
			face->gauche->cases[2][0] = save[2];
			face->gauche->cases[2][1] = save[1];
			face->gauche->cases[2][2] = save[0];
			save[0] = saveUn;
			save[1] = saveDeux;
			save[2] = saveTrois;
			index++;
			pivothaut(face->gauche,quelface,save,index);
		}
		else if(index==2)
		{
			face->droite->cases[0][0] = save[2];
			face->droite->cases[0][1] = save[1];
			face->droite->cases[0][2] = save[0];
			index++;
			pivothaut(NULL,quelface,save,index);
		}
	}
	//Executer une rotation basse de la face 2
	//if(quelface == 4)
}
//Rotation bas horaire
void pivotbas(pcote face, int quelface, int *save, int index)
{
	if(index == 3){free(save);return;}
	if((quelface == 1)||(quelface == 3)||(quelface==5)||(quelface==6))
	{
		if(quelface == face->name)
		{
			//Preparation de la rotation vers le haut
			save = (int*)malloc(sizeof(int)*3);
			save[0] = face->gauche->cases[2][0];
			save[1] = face->gauche->cases[2][1]; 
			save[2] = face->gauche->cases[2][2]; 
			face->gauche->cases[2][0] = face->cases[2][0];
			face->gauche->cases[2][1] = face->cases[2][1];
			face->gauche->cases[2][2] = face->cases[2][2];
			face->cases[2][0] = face->droite->cases[2][0];
			face->cases[2][1] = face->droite->cases[2][1];
			face->cases[2][2] = face->droite->cases[2][2];
			
			//Modification de la face a gauche
			RotationG(face->bas);
			index++;
			pivotbas(face->gauche,quelface,save,index);
		}
		else if(index==1)
		{
			int saveUn = 0; int saveDeux = 0; int saveTrois = 0; 
			saveUn =face->gauche->cases[0][0];
			saveDeux = face->gauche->cases[0][1];
			saveTrois = face->gauche->cases[0][2];
			face->gauche->cases[0][0] = save[2];
			face->gauche->cases[0][1] = save[1];
			face->gauche->cases[0][2] = save[0];
			save[0] = saveUn;
			save[1] = saveDeux;
			save[2] = saveTrois;
			index++;
			pivotbas(face->gauche,quelface,save,index);
		}
		else if(index==2)
		{
			face->droite->cases[2][0] = save[2];
			face->droite->cases[2][1] = save[1];
			face->droite->cases[2][2] = save[0];
			index++;
			pivotbas(NULL,quelface,save,index);
		}
	}
	//Executer une rotation basse de la face 2
	//if(quelface == 4)
}
//Rotation a gauche antihoraire
void pivotGauche(pcote face, int quelface, int *save, int index)
{
	
	if(index == 4){ free(save);return;}
	else if(quelface < 5)
	{
		if(quelface == face->name)
		{
			//Preparation de la rotation vers le haut
			save = (int*)malloc(sizeof(int)*3);
			save[0] = face->haut->cases[0][0];
			save[1] = face->haut->cases[1][0]; 
			save[2] = face->haut->cases[2][0]; 
			face->haut->cases[0][0] = face->cases[0][0];
			face->haut->cases[1][0] = face->cases[1][0];
			face->haut->cases[2][0] = face->cases[2][0];
			
			//Modification de la face a gauche
			RotationG(face->gauche);
			index++;
			pivotGauche(face->haut,quelface,save,index);
		}
		else if(quelface<5)
		{//printf("Je suis dans la boucle %d %d %d",save[0],save[1],save[2]);
			int saveUn = 0; int saveDeux = 0; int saveTrois = 0; 
			saveUn =face->haut->cases[0][0];
			saveDeux = face->haut->cases[1][0];
			saveTrois = face->haut->cases[2][0];
			face->haut->cases[0][0] = save[0];
			face->haut->cases[1][0] = save[1];
			face->haut->cases[2][0] = save[2];
			save[0] = saveUn;
			save[1] = saveDeux;
			save[2] = saveTrois;
			index++;
			pivotGauche(face->haut,quelface,save,index);
		}
	}
	else if(quelface == 5)
	{	
		if(quelface == face->name)
		{
			//Preparation de la rotation vers le haut
			save = (int*)malloc(sizeof(int)*3);
			save[2] = face->haut->cases[2][0];
			save[1] = face->haut->cases[2][1]; 
			save[0] = face->haut->cases[2][2]; 
			face->haut->cases[2][0] = face->cases[0][0];
			face->haut->cases[2][1] = face->cases[1][0];
			face->haut->cases[2][2] = face->cases[2][0];
			
			//Modification de la face a gauche
			RotationG(face->gauche);
			index++;
			pivotGauche(face->haut,quelface,save,index);
		}
		else if(index == 1)
		{
			int saveUn = 0; int saveDeux = 0; int saveTrois = 0; 
			saveUn =face->gauche->cases[0][2];
			saveDeux = face->gauche->cases[1][2];
			saveTrois = face->gauche->cases[2][2];
			face->gauche->cases[0][2] = save[0];
			face->gauche->cases[1][2] = save[1];
			face->gauche->cases[2][2] = save[2];
			save[0] = saveUn;
			save[1] = saveDeux;
			save[2] = saveTrois;
			index++;
			pivotGauche(face->gauche,quelface,save,index);
		}
		else if(index == 2)
		{
			int saveUn = 0; int saveDeux = 0; int saveTrois = 0; 
			saveUn = face->bas->cases[0][0];
			saveDeux = face->bas->cases[0][1];
			saveTrois = face->bas->cases[0][2];
			face->bas->cases[0][0] = save[0];
			face->bas->cases[0][1] = save[1];
			face->bas->cases[0][2] = save[2];
			save[0] = saveUn;
			save[1] = saveDeux;
			save[2] = saveTrois;
			index++;
			pivotGauche(face->bas,quelface,save,index);
		}
		else if(index == 3)
		{
			face->droite->cases[0][0] = save[2];
			face->droite->cases[1][0] = save[1];
			face->droite->cases[2][0] = save[0];
			index = index +1;
			pivotGauche(NULL,quelface,save,index);
		}
	}
	
}

//Rotation a droite horaire
void pivotDroit(pcote face, int quelface, int *save, int index)
{
	if(index == 4){free(save);return;}
	if(quelface<5)
	{
		if(quelface == face->name)
		{
			//Preparation de la rotation vers le haut
			save = (int*)malloc(sizeof(int)*3);
			save[0] = face->haut->cases[0][2];
			save[1] = face->haut->cases[1][2]; 
			save[2] = face->haut->cases[2][2]; 
			face->haut->cases[0][2] = face->cases[0][2];
			face->haut->cases[1][2] = face->cases[1][2];
			face->haut->cases[2][2] = face->cases[2][2];
			
			//Modification de la face a gauche
			RotationD(face->droite);
			
		}
		else if(quelface<5)
		{
			int saveUn = 0; int saveDeux = 0; int saveTrois = 0; 
			saveUn =face->haut->cases[0][2];
			saveDeux = face->haut->cases[1][2];
			saveTrois = face->haut->cases[2][2];
			face->haut->cases[0][2] = save[0];
			face->haut->cases[1][2] = save[1];
			face->haut->cases[2][2] = save[2];
			save[0] = saveUn;
			save[1] = saveDeux;
			save[2] = saveTrois;
		}
		index++;
		pivotDroit(face->haut,quelface,save,index);
	}
	
	else if(quelface == 5)
	{
		if(quelface == face->name)
		{
			//Preparation de la rotation vers le haut
			save = (int*)malloc(sizeof(int)*3);
			save[2] = face->haut->cases[0][0];
			save[1] = face->haut->cases[0][1]; 
			save[0] = face->haut->cases[0][2]; 
			face->haut->cases[0][0] = face->cases[0][2];
			face->haut->cases[0][1] = face->cases[1][2];
			face->haut->cases[0][2] = face->cases[2][2];
			
			//Modification de la face a gauche
			RotationD(face->droite);
			index++;
			pivotDroit(face->haut,quelface,save,index);
		}
		else if(index == 1)
		{
			int saveUn = 0; int saveDeux = 0; int saveTrois = 0; 
			saveUn =face->gauche->cases[0][0];
			saveDeux = face->gauche->cases[1][0];
			saveTrois = face->gauche->cases[2][0];
			face->gauche->cases[0][0] = save[0];
			face->gauche->cases[1][0] = save[1];
			face->gauche->cases[2][0] = save[2];
			save[0] = saveUn;
			save[1] = saveDeux;
			save[2] = saveTrois;
			index++;
			pivotDroit(face->gauche,quelface,save,index);
		}
		else if(index == 2)
		{
			int saveUn = 0; int saveDeux = 0; int saveTrois = 0; 
			saveUn = face->bas->cases[2][0];
			saveDeux = face->bas->cases[2][1];
			saveTrois = face->bas->cases[0][2];
			face->bas->cases[2][0] = save[0];
			face->bas->cases[2][1] = save[1];
			face->bas->cases[2][2] = save[2];
			save[0] = saveUn;
			save[1] = saveDeux;
			save[2] = saveTrois;
			index++;
			pivotDroit(face->bas,quelface,save,index);
		}
		else if(index == 3)
		{
			face->droite->cases[0][2] = save[2];
			face->droite->cases[1][2] = save[1];
			face->droite->cases[2][2] = save[0];
			index++;
			pivotDroit(face,quelface,save,index);
		}
	}
	else if(quelface == 6)
	{
	}
}

void Mouvement(int choix, pcube rubi)
{
	switch (choix) {
		
		
		case 1:
			printf("Pivot horaire Droit face frontale \n");
			pivotDroit(rubi->face[0],rubi->face[0]->name,NULL,0);
			break;
		case 2:
			printf("Pivot horaire Gauche face frontale\n");
			pivotGauche(rubi->face[0],rubi->face[0]->name,NULL,0);
			break;
								  
		case 3:
			printf("Pivot horaire Bas face frontale \n");
			pivotbas(rubi->face[0],rubi->face[0]->name,NULL,0);				
			break;		
		case 4:
			printf("Pivot horaire Haut face frontale \n");
			pivothaut(rubi->face[0],rubi->face[0]->name,NULL,0);	
			break;
		case 5:
			printf("Pivot horaire Gauche face lateral \n");
			pivotGauche(rubi->face[4],rubi->face[4]->name,NULL,0);
			break;
		case 6 :
			printf("Pivot horaire Droite face lateral \n");
			pivotDroit(rubi->face[4],rubi->face[4]->name,NULL,0);
			break;
		default:	printf("Erreur de saisie \n");
			break;	
	}
}