#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <SDL/SDL.h>
#include "main.h"
#include "options.h"
#include "evenements.h"
#include "son.h"

int NB_PERSO=2, VITESSE=35, REGEN=6, NBOMBES=25;
int REBOURS=90, BONUSFREQ=3, NROUNDS=6;
int avecson=1, avecmusique=1, avecjoy=0;
int pleinecran=1, dblebuf=1;
int pointdavance=1, changepersos=0, modejeu=0;
int langue=FR;
char bicfg[256];

char niveaux[40][256], **persoliste=NULL;
int nb_niveaux=0, nsprit=0;

void chargetouches(FILE *fich)
{
  int i, n=0;
  int nbfait;
  if (fscanf(fich, "Configuration des touches :\n"))
    erreur("Configuration des touches introuvable dans", bicfg);
  for (i=0; i<8; i++)
    {
      nbfait=0;
      if (fscanf(fich, "PERSO %i\n", &n)==1) nbfait++;
      if (fscanf(fich, "haut=%i\n", &perso[n].cmd.haut)==1) nbfait++;
      if (fscanf(fich, "bas=%i\n", &perso[n].cmd.bas)==1) nbfait++;
      if (fscanf(fich, "gauche=%i\n", &perso[n].cmd.gauche)==1) nbfait++;
      if (fscanf(fich, "droite=%i\n", &perso[n].cmd.droite)==1) nbfait++;
      if (fscanf(fich, "b1=%i\n", &perso[n].cmd.b1)==1) nbfait++;
      if (fscanf(fich, "b2=%i\n", &perso[n].cmd.b2)==1) nbfait++;
      if (nbfait<7)
	erreur("Configuration des touches errorifiée dans", bicfg);
    }

  return;
}


/*--Recherche du répertoire d'installation--*/
char * rep_install(char * home)
{
  char dir[256];
  sprintf (dir, "%s/data/Sprites/citrouille.spr", ".");
  if (fopen(dir, "r")) return "./data";
  sprintf (dir, "%s/data/Sprites/citrouille.spr", "..");
  if (fopen(dir, "r")) return "../data";
  sprintf (dir, "%s/Sprites/citrouille.spr", DIR);
  if (fopen(dir, "r")) return DIR;
  sprintf (dir, "%s/BomberInstinct/data/Sprites/citrouille.spr", home);
  if (fopen(dir, "r")) return strcat(home,"/BomberInstinct/data");
  erreur("Le programme ne peut déterminer son répertoire d'installation.\nVérifiez qu'il est correctement installé",NULL);
  return "";
}


void chargeconfig(void)
{
  FILE *fich;
  int i, nbfait=0;
  char home[256];

#ifndef win32
  strcpy(home,getenv("HOME"));
#else
  sprintf(home, "");
#endif
  
  strcpy(repertoire, rep_install(home));
  printf("Données trouvées dans : %s\n", repertoire);

  sprintf(bicfg, "%s/.bi.cfg", home);
  fich=fopen(bicfg, "r");
  if (fich==NULL) {
    sprintf(bicfg, "%s/bi.cfg", repertoire);
    fich=fopen(bicfg, "r"); }
  printf("Fichier de configuration : %s\n", bicfg);

  nb_niveaux=0;
  persoliste=(char **)calloc(MAX_NPERSO, sizeof(char *));
  for (i=0; i<MAX_NPERSO; i++)
    persoliste[i]=(char *)calloc(256, sizeof(char));
  nsprit=0;


  if (fich==NULL)
    erreur("Impossible d'ouvrir le fichier de configuration", bicfg);
  if (fscanf(fich, "VITESSE=%i\n", &VITESSE)==1) nbfait++;
  if (fscanf(fich, "JOYSTICK=%i\n", &avecjoy)==1) nbfait++;
  if (fscanf(fich, "SON=%i\n", &avecson)==1) nbfait++;
  if (fscanf(fich, "MUSIQUE=%i\n", &avecmusique)==1) nbfait++;
  if (fscanf(fich, "PLEINECRAN=%i\n", &pleinecran)==1) nbfait++;
  if (fscanf(fich, "DOUBLEBUF=%i\n", &dblebuf)==1) nbfait++;
  if (fscanf(fich, "NROUNDS=%i\n", &NROUNDS)==1) nbfait++;
  if (fscanf(fich, "POINTDAVANCE=%i\n", &pointdavance)==1) nbfait++;
  if (fscanf(fich, "CHANGEPERSOS=%i\n", &changepersos)==1) nbfait++;
  if (fscanf(fich, "MODEJEU=%i\n", &modejeu)==1) nbfait++;
  if (fscanf(fich, "LANGUE=%i\n", &langue)==1) nbfait++;
  
  while (fscanf(fich, "NIVEAU=%s\n", niveaux[nb_niveaux])==1)
    nb_niveaux++;
  while (fscanf(fich, "PERSO=%s\n", persoliste[nsprit])==1)
    nsprit++;
  if (nbfait<11 || nb_niveaux<1 || nsprit<1) {
    erreur("Fichier de configuration corrompu", bicfg); }

  chargetouches(fich);

  fclose(fich);

  return;
}  


void sauvecfg(void)
{
  FILE *fich;
  int i;

  sprintf(bicfg, "%s/bi.cfg", repertoire);
  fich=fopen(bicfg, "w");
  if (fich==NULL) {
    sprintf(bicfg, "%s/.bi.cfg", getenv("HOME"));
    fich=fopen(bicfg, "w"); }

  if (fich==NULL) erreur("Impossible d'ouvrir le fichier de configuration pour sauvegarde", bicfg);

  //fprintf(fich, "REPERTOIRE=%s\n", repertoire);
  fprintf(fich, "VITESSE=%i\n", 1000/VITESSE);
  fprintf(fich, "JOYSTICK=%i\n", avecjoy);
  fprintf(fich, "SON=%i\n", avecson);
  fprintf(fich, "MUSIQUE=%i\n", avecmusique);
  fprintf(fich, "PLEINECRAN=%i\n", pleinecran);
  fprintf(fich, "DOUBLEBUF=%i\n", dblebuf);
  fprintf(fich, "NROUNDS=%i\n", NROUNDS);
  fprintf(fich, "POINTDAVANCE=%i\n", pointdavance);
  fprintf(fich, "CHANGEPERSOS=%i\n", changepersos);
  fprintf(fich, "MODEJEU=%i\n", modejeu);
  fprintf(fich, "LANGUE=%i\n", langue);
  fprintf(fich, "\n");
  for (i=0; i<nb_niveaux; i++)
    fprintf(fich, "NIVEAU=%s\n", niveaux[i]);
  fprintf(fich, "\n");
  for (i=0; i<nsprit; i++)
    fprintf(fich, "PERSO=%s\n", persoliste[i]);
  fprintf(fich, "\n");

  fprintf(fich, "Configuration des touches :\n\n");

  for (i=0; i<8; i++)
    {
      fprintf(fich, "PERSO %i\n", i);
      fprintf(fich, "haut=%i\n", perso[i].cmd.haut);
      fprintf(fich, "bas=%i\n", perso[i].cmd.bas);
      fprintf(fich, "gauche=%i\n", perso[i].cmd.gauche);
      fprintf(fich, "droite=%i\n", perso[i].cmd.droite);
      fprintf(fich, "b1=%i\n", perso[i].cmd.b1);
      fprintf(fich, "b2=%i\n", perso[i].cmd.b2);
      fprintf(fich, "\n");
    }

  fclose(fich);
  bruitsplus(s_teleport, 1);

  return;
}

void choisitjoy(int n, int lequel)
{
  perso[n].cmd.joy=joystick[lequel];
  perso[n].cmd.haut=lequel;
  perso[n].cmd.bas=perso[n].cmd.gauche=
    perso[n].cmd.droite=perso[n].cmd.b1=
    perso[n].cmd.b2=0;
  return;
}

int attendtouche(int n, int *oulamettre)
{
  SDL_Event event;

  do  SDL_WaitEvent(&event);
  while ((event.type!=SDL_KEYDOWN
	  || event.key.keysym.sym==SDLK_F1
	  || event.key.keysym.sym==SDLK_F8
	  || event.key.keysym.sym==SDLK_F10
	  || event.key.keysym.sym==SDLK_PAUSE)
	 && event.type!=SDL_JOYBUTTONDOWN);
  bruitsplus(s_bouton, 1);

  if (event.type==SDL_KEYDOWN)
    {
      if (event.key.keysym.sym==SDLK_ESCAPE)
	return 1;
      (*oulamettre)=event.key.keysym.sym;
      do  SDL_WaitEvent(&event);
      while (event.type!=SDL_KEYUP);
      return 0;
    }
  else
    {
      choisitjoy(n, event.jbutton.which);
      return 1;
    }
}

void touchescfg(int x, int y, int n)
{
  SDL_Event evt;
  perso[n].cmd.joy=NULL;
  
  while (SDL_PollEvent(&evt)); /* Vider la file d'évènements */

  blitsprit(couleurs, 0, 0, x*32, y*32);
  blitsprit(fleche, 0, 0, x*32, y*32);
  SDL_Flip(ecran);
  if (attendtouche(n, &perso[n].cmd.haut)) return;

  blitsprit(couleurs, 0, 0, x*32, y*32);
  blitsprit(fleche, 1, 0, x*32, y*32);
  SDL_Flip(ecran);
  if (attendtouche(n, &perso[n].cmd.bas)) return;

  blitsprit(couleurs, 0, 0, x*32, y*32);
  blitsprit(fleche, 2, 0, x*32, y*32);
  SDL_Flip(ecran);
  if (attendtouche(n, &perso[n].cmd.gauche)) return;

  blitsprit(couleurs, 0, 0, x*32, y*32);
  blitsprit(fleche, 3, 0, x*32, y*32);
  SDL_Flip(ecran);
  if (attendtouche(n, &perso[n].cmd.droite)) return;

  blitsprit(couleurs, 0, 0, x*32, y*32);
  blitsprit(bombe, 0, 0, x*32, y*32);
  SDL_Flip(ecran);
  if (attendtouche(n, &perso[n].cmd.b1)) return;
  
  blitsprit(couleurs, 0, 0, x*32, y*32);
  blitsprit(teleport, 0, 0, x*32, y*32);
  SDL_Flip(ecran);
  if (attendtouche(n, &perso[n].cmd.b2)) return;  
  
  return;
}


void dessineregl(Evenement * e)
{
  int i=1, var=0;
  int x=e->pos.x;
  int y=e->pos.y;
  switch (pl[x][y].params[0])
    {
    case 0 : var=(1000/VITESSE)/4; break;
    case 1 : var=NROUNDS; break;
    }
  while (i<=var && (x+i<16)) {
    blitsprit (bombe, 0, 0, 32*(x+i), y*32);
    i++; }
  while (x+i<16) { rscaseplus(x+i, y); i++; }
  return;
}

/* Evenement de case pour le réglage des options */
/* Les paramètres sont sous la forme [quoirègler][min][max] */
void reglage(Evenement * e)
{
  int var=0;
  int n=e->proprietaire;
  int param=e->param;

  if (perso[n].pos.x == e->pos.x
      && perso[n].pos.y == e->pos.y)
    e->fois++;

  if (perso[n].cmd.actif&CMD_GAUCHE && !(perso[n].cmd.precedent&CMD_GAUCHE))
    var--;
  if (perso[n].cmd.actif&CMD_DROITE && !(perso[n].cmd.precedent&CMD_DROITE))
    var++;

  switch (param)
    {
    case 0 : VITESSE=250/((250/VITESSE)+var); break;
    case 1 : NROUNDS+=var; break;
    }

  return;
}


void dessinebouton(Evenement * e)
{
  int var=0;
  int x=e->pos.x;
  int y=e->pos.y;
  switch (pl[x][y].params[0])
    {
    case 0 : var=avecson; break;
    case 1 : var=avecmusique; break;
    case 2 : var=pleinecran; break;
    case 3 : var=langue; break;
    case 4 : var=pointdavance; break;
    case 5 : var=changepersos; break;
    }
  blitsprit (bouton, 2, var, 32*x, 32*y);
  return;
}


void onoff(Evenement * e)
{
  int x=e->pos.x;
  int y=e->pos.y;
  switch (pl[x][y].params[0])
    {
    case 0 : avecson=!avecson; break;
    case 1 : avecmusique=!avecmusique;
      if (avecmusique && !musintro) {
	musintro = chargemus("intro.s3m"); 
	muschoix = chargemus("choix.s3m"); }
      if (avecmusique) 	Mix_PlayMusic(musintro, -1);
      else Mix_HaltMusic();
      break;
    case 2 : passenpleinecran(); break;
    case 3 : langue=!langue; break;
    case 4 : pointdavance=!pointdavance; break;
    case 5 : changepersos=!changepersos; break;
    }
  bruitsplus(s_bouton, 1);
  
  return;
}


char * choixlangue(char where[], const char nom[], const char ext[])
{
  char x[5]="fr";
  if (langue==ENG) sprintf(x, "en");
  sprintf(where, "%s_%s.%s", nom, x, ext);
  return where;
}
