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

typedef struct coordonnees coordonnees;

void jeux(SDL_Surface *screen, long size);
void positionPlat( coordonnees souris, long size, coordonnees *board);
void positionTab( coordonnees souris, long size, coordonnees *board);



struct coordonnees
{
    long x;
    long y;
};


typedef struct piece piece;
struct piece
{
    coordonnees tableau;// coordonnes de la piece ds le tableau
    coordonnees pixel;// coordonnees sur l'ecran
    long id;
    long partieh, partied, partieb, partieg;


};

//chargement depuis le fichier texte
void chargementpiece(piece* piece2, long nbpiece)
{
   FILE* fichier = NULL;

   long cpt;

   fichier = fopen("piece sans ext.txt", "r");

   if (fichier != NULL)
   {
      for(cpt=0 ; cpt < nbpiece ; cpt++)
      {

         fscanf(fichier, "%ld\t%ld\t%ld\t%ld", &piece2[cpt].partieh, &piece2[cpt].partied, &piece2[cpt].partieb, &piece2[cpt].partieg);
         printf("%ld %ld %ld %ld\n", piece2[cpt].partieh, piece2[cpt].partied, piece2[cpt].partieb, piece2[cpt].partieg);

      }

      fclose(fichier);
    }

    for(cpt=0 ; cpt < nbpiece ; cpt++)
    {
//        piece2[cpt].id = IMG_Load("Piece/$cpt.jpg");
    }
}


void positionPlat( coordonnees souris, long size, coordonnees *board)
{


    if(size == 4)//en fonction des plateau de jeu
    {
        board->x = (souris.x - 308) / 55; // car les tableaux ne commencent pas sur le meme pixel
        board->y = (souris.y - 221) / 55;
    }
    else if(size == 8)
    {
        board->x = (souris.x - 25) / 55;
        board->y = (souris.y - 124) / 55;
    }
    else if(size == 12)
    {
        board->x = (souris.x - 170) / 30;
        board->y = (souris.y - 160) / 30;

    }
    else if(size == 16)
    {
        board->x = (souris.x - 50) / 30;
        board->y = (souris.y - 102) / 30;
    }

}


void positionTab(coordonnees souris, long size, coordonnees *board)
{


    if(size == 4)//en fonction des plateau de jeu
    {
        board->x = (souris.x - 756) / 55; // car les tableaux ne commencent pas sur le meme pixel
        board->y = (souris.y - 221) / 55;
    }
    else if(size == 8)
    {
        board->x = (souris.x - 829) / 55;
        board->y = (souris.y - 124) / 55;
    }
    else if(size == 12)
    {
        board->x = (souris.x - 780) / 30;
        board->y = (souris.y - 156) / 30;

    }
    else if(size == 16)
    {
        board->x = (souris.x - 768) / 30;
        board->y = (souris.y - 102) / 30;
    }



}




void game(SDL_Surface *screen)
{


    coordonnees souris;
    long continuer = 0;

    SDL_Surface* bmp = SDL_LoadBMP("level.bmp");
     if (!bmp)
    {
        printf("Unable to load bitmap: %s\n", SDL_GetError());
        continuer = 1;
    }
    SDL_Rect dstrect;
    dstrect.x = 0;
    dstrect.y = 0;

    SDL_Event event;

    SDL_BlitSurface(bmp, 0, screen, &dstrect);
    SDL_Flip(screen);
    do
    {
        while (SDL_PollEvent(&event))
            {
                // check for messages
                switch (event.type)
                {                // exit if the window is closed

                case SDL_QUIT:
                    continuer = 1;
                    break; // check for keypresses
                case SDL_KEYDOWN:
                    {
                        // exit if ESCAPE is pressed
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            continuer = 1;
                        break;
                    }
                case SDL_MOUSEBUTTONDOWN: /* Clic de la souris */
                    {

                        souris.x = event.button.x;
                        souris.y = event.button.y;
                        if( souris.x > 560 && souris.x < 755 && souris.y > 210 && souris.y < 250)//plateau 4.4
                        {
                            jeux( screen, 4);
                        }
                        else if( souris.x > 564 && souris.x < 755 && souris.y > 277 && souris.y < 317)//plateau 8.8
                        {
                            jeux( screen, 8);
                        }
                        else if( souris.x > 560 && souris.x < 755 && souris.y > 346 && souris.y < 381)//plateau 12.12
                        {
                            jeux( screen, 12);
                        }
                        else if( souris.x > 560 && souris.x < 755 && souris.y > 409 && souris.y < 443)//plateau 16.16
                        {
                            jeux( screen, 16);
                        }
                    }



                } // end switch
            }
    }
    while( !continuer );


}

void jeux(SDL_Surface *screen, long size)
{
    piece temp;
    long nbpiece;
    piece plateau[16][16];
  //  piece *ptr1 = &plateau[0][0];
    piece tab[16][16];

    piece *repertoire[256];
    coordonnees board;


    long continuer = 0;
    coordonnees souris;
    SDL_Surface *bmp;
    if(size == 4)
    {
        bmp = SDL_LoadBMP("p4.bmp");//afficher le plateau qui correspond a la requete utilisateur
        nbpiece = 16;
        chargementpiece(*repertoire, nbpiece);

    }
    else if(size == 8)
    {
        bmp = SDL_LoadBMP("p8.bmp");
        nbpiece = 64;
        chargementpiece(*repertoire, nbpiece);

    }
    else if(size == 12)
    {
        bmp = SDL_LoadBMP("p12.bmp");
        nbpiece = 144;
        chargementpiece(*repertoire, nbpiece);

    }
    else if(size == 16)
    {
        bmp = SDL_LoadBMP("p16.bmp");
        nbpiece = 256;
        chargementpiece(*repertoire, nbpiece);

    }


    SDL_Rect dstrect;
    dstrect.x = 0;
    dstrect.y = 0;

    SDL_Event event;

    SDL_BlitSurface(bmp, 0, screen, &dstrect);
    SDL_Flip(screen);

    do
    {
        while (SDL_PollEvent(&event))
            {
                // check for messages
                switch (event.type)
                {                // exit if the window is closed

                case SDL_QUIT:
                    continuer = 1;
                    break; // check for keypresses
                case SDL_KEYDOWN:
                    {
                        // exit if ESCAPE is pressed
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            continuer = 1;
                        break;
                    }
                case SDL_MOUSEBUTTONDOWN: // prise d'une piece
                    {

                        souris.x = event.button.x;
                        souris.y = event.button.y;
                        if( souris.x < 650 )
                        {
                            positionPlat( souris, size, &board);
                            if( plateau[board.x][board.y].id != 0)// si la case contient une piece
                            {
                                temp = plateau[board.x][board.y]; // on prend la piece dans une variable
                                temp.tableau.x = board.x; //on stock la derniere position sur de la piece, si jamais on a besoin de la replacer
                                temp.tableau.y = board.y;
                                temp.pixel.x = souris.x; //on stock aussi le x pour savoir de quel tableau part la piece
                                plateau[board.x][board.y].id = 0; // on met id à 0 pour signifier que la case est vide
                            }

                        }
                        else if( souris.x > 650 )
                        {
                            positionTab( souris, size, &board);
                            if(tab[board.x][board.y].id != 0)// si la case contient une piece
                            {
                                temp = tab[board.x][board.y]; // on prend la piece dans une variable
                                temp.tableau.x = board.x; //on stock la derniere position sur de la piece, si jamais on a besoin de la replacer
                                temp.tableau.y = board.y;
                                temp.pixel.x = souris.x; //on stock aussi le x pour savoir de quel tableau part la piece
                                tab[board.x][board.y].id = 0; // on met id à 0 pour signifier que la case est vide
                            }
                        }
                        break;
                    }
                case SDL_MOUSEBUTTONUP: // positionnement de la piece
                    {

                        souris.x = event.button.x;
                        souris.y = event.button.y;
                        if( souris.x < 650 )
                        {
                            positionPlat( souris, size, &board);
                            if(plateau[board.x][board.y].id == 0)// si la case est vide
                            {
                                plateau[board.x][board.y] = temp; // on depose la piece dans le tableau
                            }
                            else// la case est deja prise
                            {
                                if( temp.pixel.x < 650)// si la piece vient du plateau
                                {
                                    plateau[temp.tableau.x][temp.tableau.y] = temp; //on remet la piece à sa place d'origine
                                }
                                else //l'autre cas est que la piece vienne de tab donc
                                    tab[temp.tableau.x][temp.tableau.y] = temp;

                            }

                        }
                        else if( souris.x > 650 )
                        {
                            positionTab( souris, size, &board);
                            if(tab[board.x][board.y].id == 0)// si la case est vide
                            {
                                tab[board.x][board.y] = temp; // on depose la piece dans le tableau
                            }
                            else// la case est deja prise
                            {
                                if( temp.pixel.x < 650)// si la piece vient du plateau
                                {
                                    plateau[temp.tableau.x][temp.tableau.y] = temp; //on remet la piece à sa place d'origine
                                }
                                else //l'autre cas est que la piece vienne de tab donc
                                    tab[temp.tableau.x][temp.tableau.y] = temp;

                            }
                        }
                        break;
                    }
                        break;

                } // end switch
            }
    }
    while( !continuer);
    game(screen);
}

