#include <stdlib.h>
#include <fstream>
#include <time.h>
#include "person.h"
#include "city.h"
#include "graph.h"

using namespace std;

int main(int argc, char* argv[]) {
  
  // Open and check the input stream
  if (argc != 2) {
    cout << "Wrong number of arguments.\n";
    return 1;
  }
  ifstream in_str(argv[1]);
  if (!in_str) {
    cout << "Bad file name\n";
    return 1;
  }

  // seed the random number generator
  srand(time(NULL));

  // The main object
  Graph city_graph;
  string request, name1, name2;
  int count;
  
  // While there are more requests, determine the type of request and handle it. 
  while (in_str >> request) {
    if (request == "add-city") {
      in_str >> name1;
      if (city_graph.add_city(name1))
        cout << "Added city " << name1 << endl;
      else
        cout << "Error trying to add city " << name1 << endl;
    } else if (request == "remove-city") {
      in_str >> name1;
      if (city_graph.remove_city(name1))
        cout << "Removed city " << name1 << endl;
      else 
        cout << "Error trying to remove city " << name1 << endl;
    } else if (request == "add-link") {
      in_str >> name1 >> name2;
      if (city_graph.add_link(name1, name2)) 
        cout << "Linked cities " << name1 << " and " << name2 << endl;
      else
        cout << "Error trying to link cities " << name1 << " and " << name2 << endl;
    } else if (request == "remove-link") {
      in_str >> name1 >> name2;
      if (city_graph.remove_link(name1, name2))
        cout << "Removed link from cities " << name1 << " and " << name2 << endl;
      else
        cout << "Error trying to remove link from cities " << name1 << " and " << name2 << endl;
    } else if (request == "place-evader") {
      in_str >> name1 >> name2;
      if (city_graph.place_evader(name1,name2))
        cout << "Placed evader " << name1 << " in city " << name2 << endl;
      else
        cout << "Error trying to place evader " << name1 << " in city " << name2 << endl;
    } else if (request == "place-pursuer") {
      in_str >> name1 >> name2;
      if (city_graph.place_pursuer(name1,name2))
        cout << "Placed pursuer " << name1 << " in city " << name2 << endl;
      else 
        cout << "Error trying to place pursuer " << name1 << " in city " << name2 << endl;
    } else if (request == "print") {
      cout << city_graph;
    } else if (request == "tick") {
      in_str >> count;
      while (count > 0) {
        if (!city_graph.tick()) {
          cout << "Evader loses" << endl;
          return 0; // game over
        }
        count--;
      }
    } else {
      cout << "Illegal input: " << request << endl;
    }
  }

  if (city_graph.get_evader() != NULL) 
    cout << "Evader wins" << endl;
  else 
    cout << "No evader in graph to capture" << endl;

  // The memory allocated for the graph is deleted when it goes out of scope.
  return 0;
}


