#include "partie.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <graph.h>


void initialiser_plateau(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne){
  int i, j;
  int compteur = 1;

  grille[0][0] = 0;
  
  for (i = 0; i < nb_ligne; i++){
    for(j = 0; j < nb_colonne; j++){
      /*On saute la 1er case*/
      if (i == 0 && j== 0)continue;
      grille[i][j] = compteur;
      compteur++;
    }
  }
}

int deplacer(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne,int touche) {
  int i, j;
  int vide_i = -1, vide_j = -1;
  int cible_i, cible_j;
  int temp;

  /* Trouver la case vide */
  for(i = 0; i < nb_ligne; i++) {
    for(j = 0; j< nb_colonne; j++) {
      if (grille[i][j] == 0) {
	/*vide i/j est l'adresse du trou*/
	vide_i = i;
	vide_j = j;
      }
    }
  }

/*cible i/j c'est l'adress de la case voisine qu'on veut faire glisser */
cible_i = vide_i;
cible_j = vide_j;

/* Calculer la cible */
if(touche == XK_Left) cible_j = vide_j - 1;
 else if(touche == XK_Right) cible_j = vide_j + 1;
 else if(touche == XK_Up) cible_i = vide_i - 1;
 else if(touche == XK_Down) cible_i = vide_i + 1;
 else {
   return 0;
 }
/* Vérifier les bords */
if (cible_i < 0 || cible_i >= nb_ligne ||
    cible_j < 0 || cible_j >= nb_colonne) {
  return 0;
 }

/* Echanger */
temp = grille[cible_i][cible_j];
grille[cible_i][cible_j] = 0;
grille[vide_i][vide_j] = temp;
 return 1;
}

int deplacer_souris(int grille[MAX_TAILLE][MAX_TAILLE], int nb_ligne, int nb_colonne, int clic_x, int clic_y, int l_case, int h_case) {

  int case_x = clic_x / l_case;
  int case_y = clic_y / h_case;
  int vide_i, vide_j, i, j;

  /* si on clique dehors ça ne fais rien */
  if (case_x >= nb_colonne || case_y >= nb_ligne) return 0;
  /* recherche case vide */
  for(i=0; i<nb_ligne; i++) {
    for(j=0; j<nb_colonne; j++) {
      if (grille[i][j] == 0) { vide_i = i; vide_j = j; }
    }
  }

  /* est-ce que la case cliqué est juste a coté du vide ? */
  if (case_y == vide_i) {
    if (case_x == vide_j - 1 || case_x == vide_j + 1) {
      grille[vide_i][vide_j] = grille[case_y][case_x];
      grille[case_y][case_x] = 0;
      return 1;
    }
  }
  else if (case_x == vide_j) {
     if (case_y == vide_i - 1 || case_y == vide_i + 1) {
      grille[vide_i][vide_j] = grille[case_y][case_x];
      grille[case_y][case_x] = 0;
      return 1;
     }
  }

  return 0;
}

void melanger_plateau(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne) {
  int i;
  int touche_aleatoire;
  int direction;

  srand(time(NULL));

  /* On fais 500 mouvements aléatoires */
  for (i = 0; i < 500; i++) {
    /* tirage d'un nombre entre 0 et 3 */
    direction = rand() % 4;

    if (direction == 0)touche_aleatoire = XK_Left;
    else if (direction == 1)touche_aleatoire = XK_Up;
    else if (direction == 2)touche_aleatoire = XK_Right;
    else touche_aleatoire = XK_Down;
    deplacer(grille,nb_ligne,nb_colonne,touche_aleatoire);
  }

}

int verifier_victoire(int grille[MAX_TAILLE][MAX_TAILLE],int nb_ligne,int nb_colonne){
  int i,j,compteur = 1;
  
  if(grille[0][0] != 0)return 0;
		
  for(i = 0; i < nb_ligne; i++) {
    for(j = 0; j< nb_colonne; j++) {
      if (i == 0 && j == 0)continue;
   
      if(grille[i][j] != compteur)return 0;
      compteur++;
    }
  }
  return 1;
}
