#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>

using namespace std;

bool checkMove(char move)
{
 switch(move)
  {
    case '1':
      if(grid[0][0] == ' ') return true;
      break;
    case '2':
      if(grid[0][1] == ' ') return true;
      break;
    case '3':
      if(grid[0][2] == ' ') return true;
      break;
    case '4':
      if(grid[1][0] == ' ') return true;
      break;
    case '5':
      if(grid[1][1] == ' ') return true;
      break;
    case '6':
      if(grid[1][2] == ' ') return true;
      break;
    case '7':
      if(grid[2][0] == ' ') return true;
      break;
    case '8':
      if(grid[2][1] == ' ') return true;
      break;
    case '9':
      if(grid[2][2] == ' ') return true;
      break;
  }
 return false;

}

char determineMove()
{
  //quick version, make it smart if time permits (unlikely)
  char moves[9] = {'1','2','3','4','5','6','7','8','9'};
  int index, seed;
  bool valid_move = false;
  
  while(valid_move == false)
  {
    seed = time(NULL);
    srand(seed);
    index = rand() % 10;
    valid_move = checkMove(moves[index]);
  }

  return(moves[index]);

}

bool checkGame()
{
  int space_counter = 0;
  //check horizontal, row 1
  if((grid[0][0] == 'O' && grid[0][1] == 'O' && grid[0][2] == 'O') || (grid[0][0] == 'X' && grid[0][1] == 'X' && grid[0][2] == 'X'))
    return true;
  //check horizontal, row 2
  if((grid[1][0] == 'O' && grid[1][1] == 'O' && grid[1][2] == 'O') || (grid[1][0] == 'X' && grid[1][1] == 'X' && grid[1][2] == 'X'))
    return true;
  //check horizontal, row 3
  if((grid[2][0] == 'O' && grid[2][1] == 'O' && grid[2][2] == 'O') || (grid[2][0] == 'X' && grid[2][1] == 'X' && grid[2][2] == 'X'))
    return true;
  //check vertical, col 1
  if((grid[0][0] == 'O' && grid[1][0] == 'O' && grid[2][0] == 'O') || (grid[0][0] == 'X' && grid[1][0] == 'X' && grid[2][0] == 'X'))
    return true;
  //check vertical, col 2
  if((grid[0][1] == 'O' && grid[1][1] == 'O' && grid[2][1] == 'O') || (grid[0][1] == 'X' && grid[1][1] == 'X' && grid[2][1] == 'X'))
    return true;
  //check vertical, col 3
  if((grid[0][2] == 'O' && grid[1][2] == 'O' && grid[2][2] == 'O') || (grid[0][2] == 'X' && grid[1][2] == 'X' && grid[2][2] == 'X'))
    return true;
  //check diagnol, top left to bottom right
  if((grid[0][0] == 'O' && grid[1][1] == 'O' && grid[2][2] == 'O') || (grid[0][0] == 'X' && grid[1][1] == 'X' && grid[2][2] == 'X'))
    return true;
  //check diagnol, top right to bottom left
  if((grid[0][2] == 'O' && grid[1][1] == 'O' && grid[2][0] == 'O') || (grid[0][2] == 'X' && grid[1][1] == 'X' && grid[2][0] == 'X'))
    return true;

  //check if all spots are full
  for(int row = 0; row < 3; row++)
    for(int col = 0; col < 3; col++)
      if(grid[row][col] == ' ')
        space_counter++;
  if(space_counter == 0)
    return true;

  return false;
}

string checkWinner()
{
  if(grid[0][0] == 'O' && grid[0][1] == 'O' && grid[0][2] == 'O')
    return "human";
  else if(grid[0][0] == 'X' && grid[0][1] == 'X' && grid[0][2] == 'X')
    return "computer";
  else if(grid[1][0] == 'O' && grid[1][1] == 'O' && grid[1][2] == 'O')
    return "human";
  else if(grid[1][0] == 'X' && grid[1][1] == 'X' && grid[1][2] == 'X')
    return "computer";
  else if(grid[2][0] == 'O' && grid[2][1] == 'O' && grid[2][2] == 'O')
    return "human";
  else if(grid[2][0] == 'X' && grid[2][1] == 'X' && grid[2][2] == 'X')
    return "computer";
  else if(grid[0][0] == 'O' && grid[1][0] == 'O' && grid[2][0] == 'O') 
    return "human";
  else if(grid[0][0] == 'X' && grid[1][0] == 'X' && grid[2][0] == 'X')
    return "computer";
  else if(grid[0][1] == 'O' && grid[1][1] == 'O' && grid[2][1] == 'O')
    return "human";
  else if(grid[0][1] == 'X' && grid[1][1] == 'X' && grid[2][1] == 'X')
    return "computer";
  else if(grid[0][2] == 'O' && grid[1][2] == 'O' && grid[2][2] == 'O')
    return "human";
  else if(grid[0][2] == 'X' && grid[1][2] == 'X' && grid[2][2] == 'X')
    return "computer";
  else if(grid[0][0] == 'O' && grid[1][1] == 'O' && grid[2][2] == 'O')
    return "human";
  else if(grid[0][0] == 'X' && grid[1][1] == 'X' && grid[2][2] == 'X')
    return "computer";
  else if(grid[0][2] == 'O' && grid[1][1] == 'O' && grid[2][0] == 'O')
    return "human";
  else if(grid[0][2] == 'X' && grid[1][1] == 'X' && grid[2][0] == 'X')
    return "computer";
  else
    return "tie";
}

