#include <stdio.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
 
const float FPS = 60;
 
int main(){
    
    int POne = 1;
    int PTwo = 0;
    
    int one = 0;
    int two = 0;
    int three = 0;
    int four = 0;
    int five = 0;
    int six = 0;
    int seven = 0;
    int eight = 0;
    int nine = 0;
 
   ALLEGRO_DISPLAY *Screen = NULL;
   ALLEGRO_EVENT_QUEUE *event_queue = NULL;
   ALLEGRO_TIMER *timer = NULL;
   
   bool Exit = false;
   bool Restart = false;
   bool Redraw = true;
   
   ALLEGRO_BITMAP *TicTacToe = NULL;
   ALLEGRO_BITMAP *X = NULL;
   ALLEGRO_BITMAP *O = NULL;
 
   if(!al_init()) {
      fprintf(stderr, "failed to initialize allegro!\n");
      return -1;
   }
 
   timer = al_create_timer(1.0 / FPS);
   if(!timer) {
      fprintf(stderr, "failed to create timer!\n");
      return -1;
   }
 
   Screen = al_create_display(96, 128);
   if(!Screen) {
      fprintf(stderr, "failed to create display!\n");
      al_destroy_timer(timer);
      return -1;
   }
 
   event_queue = al_create_event_queue();
   if(!event_queue) {
      fprintf(stderr, "failed to create event_queue!\n");
      al_destroy_display(Screen);
      al_destroy_timer(timer);
      return -1;
   }
   
   al_install_mouse();
   al_init_image_addon();
   
   TicTacToe = al_load_bitmap("TicTacToe.png");
   X = al_load_bitmap("X.png");
   O = al_load_bitmap("O.png");
    
   al_set_window_title(Screen, " ");
 
   al_register_event_source(event_queue, al_get_display_event_source(Screen));
   al_register_event_source(event_queue, al_get_mouse_event_source());
   al_register_event_source(event_queue, al_get_timer_event_source(timer));
 
   al_start_timer(timer);
 
   while(!Exit)
   {
      ALLEGRO_EVENT Event;
      al_wait_for_event(event_queue, &Event);
 
      if(Event.type == ALLEGRO_EVENT_TIMER) {
         Redraw = true;
      }
      else if(Event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
         Exit = true;
      }
      
         else if(Event.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN && POne == 1)
         {
              if(Event.mouse.button & 1 && POne == 1 && one == 0 && Event.mouse.x >= 0 && Event.mouse.x <= 32 && Event.mouse.y >= 0 && Event.mouse.y <= 32)
              {
                   one = 1;
                   POne = 0;
                   PTwo = 1;
              }
              
              else if(Event.mouse.button & 1 && POne == 1 && two == 0 && Event.mouse.x >= 32 && Event.mouse.x <= 64 && Event.mouse.y >= 0 && Event.mouse.y <= 32)
              {
                   two = 1;
                   POne = 0;
                   PTwo = 1;
              }
              
              else if(Event.mouse.button & 1 && POne == 1 && three == 0 && Event.mouse.x >= 64 && Event.mouse.x <= 96 && Event.mouse.y >= 0 && Event.mouse.y <= 32)
              {
                   three = 1;
                   POne = 0;
                   PTwo = 1;
              }
              
              else if(Event.mouse.button & 1 && POne == 1 && four == 0 && Event.mouse.x >= 0 && Event.mouse.x <= 32 && Event.mouse.y >= 32 && Event.mouse.y <= 64)
              {
                   four = 1;
                   POne = 0;
                   PTwo = 1;
              }
              
              else if(Event.mouse.button & 1 && POne == 1 && five == 0 && Event.mouse.x >= 32 && Event.mouse.x <= 64 && Event.mouse.y >= 32 && Event.mouse.y <= 64)
              {
                   five = 1;
                   POne = 0;
                   PTwo = 1;
              }
              
              else if(Event.mouse.button & 1 && POne == 1 && six == 0 && Event.mouse.x >= 64 && Event.mouse.x <= 96 && Event.mouse.y >= 32 && Event.mouse.y <= 64)
              {
                   six = 1;
                   POne = 0;
                   PTwo = 1;
              }
              
              else if(Event.mouse.button & 1 && POne == 1 && seven == 0 && Event.mouse.x >= 0 && Event.mouse.x <= 32 && Event.mouse.y >= 64 && Event.mouse.y <= 96)
              {
                   seven = 1;
                   POne = 0;
                   PTwo = 1;
              }
              
              else if(Event.mouse.button & 1 && POne == 1 && eight == 0 && Event.mouse.x >= 32 && Event.mouse.x <= 64 && Event.mouse.y >= 64 && Event.mouse.y <= 96)
              {
                   eight = 1;
                   POne = 0;
                   PTwo = 1;
              }
              
              else if(Event.mouse.button & 1 && POne == 1 && nine == 0 && Event.mouse.x >= 64 && Event.mouse.x <= 96 && Event.mouse.y >= 64 && Event.mouse.y <= 96)
              {
                   nine = 1;
                   POne = 0;
                   PTwo = 1;
              }
              else if(Event.mouse.button & 1 && Event.mouse.x >= 32 && Event.mouse.x <= 64 && Event.mouse.y >= 96 && Event.mouse.y <= 128)
              {
                   Exit = true;
                   Restart = true;
              }
         }
         else if(Event.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN && PTwo == 1)
         {
              if(Event.mouse.button & 1 && PTwo == 1 && one == 0 && Event.mouse.x >= 0 && Event.mouse.x <= 32 && Event.mouse.y >= 0 && Event.mouse.y <= 32)
              {
                   one = 2;
                   POne = 1;
                   PTwo = 0;
              }
              
              else if(Event.mouse.button & 1 && PTwo == 1 && two == 0 && Event.mouse.x >= 32 && Event.mouse.x <= 64 && Event.mouse.y >= 0 && Event.mouse.y <= 32)
              {
                   two = 2;
                   POne = 1;
                   PTwo = 0;
              }
              
              else if(Event.mouse.button & 1 && PTwo == 1 && three == 0 && Event.mouse.x >= 64 && Event.mouse.x <= 96 && Event.mouse.y >= 0 && Event.mouse.y <= 32)
              {
                   three = 2;
                   POne = 1;
                   PTwo = 0;
              }
              
              else if(Event.mouse.button & 1 && PTwo == 1 && four == 0 && Event.mouse.x >= 0 && Event.mouse.x <= 32 && Event.mouse.y >= 32 && Event.mouse.y <= 64)
              {
                   four = 2;
                   POne = 1;
                   PTwo = 0;
              }
              
              else if(Event.mouse.button & 1 && PTwo == 1 == 0 && five == 0 && Event.mouse.x >= 32 && Event.mouse.x <= 64 && Event.mouse.y >= 32 && Event.mouse.y <= 64)
              {
                   five = 2;
                   POne = 1;
                   PTwo = 0;
              }
              
              else if(Event.mouse.button & 1 && PTwo == 1 && six == 0 && Event.mouse.x >= 64 && Event.mouse.x <= 96 && Event.mouse.y >= 32 && Event.mouse.y <= 64)
              {
                   six = 2;
                   POne = 1;
                   PTwo = 0;
              }
              
              else if(Event.mouse.button & 1 && PTwo == 1 && seven == 0 && Event.mouse.x >= 0 && Event.mouse.x <= 32 && Event.mouse.y >= 64 && Event.mouse.y <= 96)
              {
                   seven = 2;
                   POne = 1;
                   PTwo = 0;
              }
              
              else if(Event.mouse.button & 1 && PTwo == 1 && eight == 0 && Event.mouse.x >= 32 && Event.mouse.x <= 64 && Event.mouse.y >= 64 && Event.mouse.y <= 96)
              {
                   eight = 2;
                   POne = 1;
                   PTwo = 0;
              }
              
              else if(Event.mouse.button & 1 && PTwo == 1 && nine == 0 && Event.mouse.x >= 64 && Event.mouse.x <= 96 && Event.mouse.y >= 64 && Event.mouse.y <= 96)
              {
                   nine = 2;
                   POne = 1;
                   PTwo = 0;
              }
              else if(Event.mouse.button & 1 && Event.mouse.x >= 32 && Event.mouse.x <= 64 && Event.mouse.y >= 96 && Event.mouse.y <= 128)
              {
                   Exit = true;
                   Restart = true;
              }
         }
 
      if(Redraw && al_is_event_queue_empty(event_queue)) {
         Redraw = false;
         
         al_draw_bitmap(TicTacToe, 0, 0, 0);
         
         if(one == 1)
         {
              al_draw_bitmap(X, 0, 0, 0);
         }
         else if(one == 2)
         {
              al_draw_bitmap(O, 0, 0, 0);
         }
         if(two == 1)
         {
              al_draw_bitmap(X, 32, 0, 0);
         }
         else if(two == 2)
         {
              al_draw_bitmap(O, 32, 0, 0);
         }
         if(three == 1)
         {
              al_draw_bitmap(X, 64, 0, 0);
         }
         else if(three == 2)
         {
              al_draw_bitmap(O, 64, 0, 0);
         }
         if(four == 1)
         {
              al_draw_bitmap(X, 0, 32, 0);
         }
         else if(four == 2)
         {
              al_draw_bitmap(O, 0, 32, 0);
         }
         if(five == 1)
         {
              al_draw_bitmap(X, 32, 32, 0);
         }
         else if(five == 2)
         {
              al_draw_bitmap(O, 32, 32, 0);
         }
         if(six == 1)
         {
              al_draw_bitmap(X, 64, 32, 0);
         }
         else if(six == 2)
         {
              al_draw_bitmap(O, 64, 32, 0);
         }
         if(seven == 1)
         {
              al_draw_bitmap(X, 0, 64, 0);
         }
         else if(seven == 2)
         {
              al_draw_bitmap(O, 0, 64, 0);
         }
         if(eight == 1)
         {
              al_draw_bitmap(X, 32, 64, 0);
         }
         else if(eight == 2)
         {
              al_draw_bitmap(O, 32, 64, 0);
         }
         if(nine == 1)
         {
              al_draw_bitmap(X, 64, 64, 0);
         }
         else if(nine == 2)
         {
              al_draw_bitmap(O, 64, 64, 0);
         }
         
         al_flip_display();
      }
   }
   
    while(Restart == true)
    {
         Restart = false;
         al_destroy_display(Screen);
         al_destroy_timer(timer);
         main();
    }
   
   al_destroy_timer(timer);
   al_destroy_display(Screen);
   al_destroy_event_queue(event_queue);
 
   return 0;
}
