#include <malloc.h>
#include <stdio.h>
#include <string.h>
#include "map.h"
#include "routing.h"

int main()
{
  char Map_File[255];
  char Query_File[255];
  FILE* Map_File_Ptr = NULL;
  FILE* Query_File_Ptr = NULL;

  fprintf(stderr, "q may be entered to quit\n");

  while(1)
    {
      fprintf(stderr, "Enter map file: ");
      scanf("%254s", Map_File);
      Map_File_Ptr = fopen(Map_File, "r");
      if (strcmp(Map_File,"q") == 0)
	{
	  if (Map_File_Ptr != NULL)
	    {
	      fclose(Map_File_Ptr);
	    }
	  return 0;
	}
      if (Map_File_Ptr == NULL)
        {
	  fprintf(stderr, "File %s does not exist!\n", Map_File);
	  continue;
        }

      break;
    }

  while(1)
    {
      fprintf(stderr, "Enter query file: ");
      scanf("%254s", Query_File);
      Query_File_Ptr = fopen(Query_File, "r");
      if (strcmp(Query_File,"q") == 0)
	{
	  if (Query_File_Ptr != NULL)
	    {
	      fclose(Query_File_Ptr);
	    }
	  fclose(Map_File_Ptr);
	  return 0;
	}
      if (Query_File_Ptr == NULL)
        {
	  fprintf(stderr, "File %s does not exist!\n", Map_File);
	  continue;
        }

      break;
    }

  Query_t* Query_Ptr = Load_Query(Query_File_Ptr);
  if (NULL == Query_Ptr)
    {
      fprintf(stderr,
	      "ERROR: Queries failed to load from %s!\n",
	      Query_File);
      fclose(Query_File_Ptr);
      fclose(Map_File_Ptr);
      return 1;
    }
  Map_t* Map_Ptr = Load_Map(Map_File_Ptr);  
  if (NULL == Map_Ptr)
    {
      fprintf(stderr,
	      "ERROR: Map failed to load from %s!\n",
	      Map_File);
      Delete_Query(Query_Ptr);
      fclose(Query_File_Ptr);
      fclose(Map_File_Ptr);
      return 2;
    }
  
  // Process the queries
  Index_t i;
  for (i = 0; i < Query_Ptr->Num_Paths; i++)
    {
      /*fprintf(stderr,"Processing query %lu (%lu-%lu)\n",
	      i,
	      Query_Ptr->Path_List_Ptr[i].From,
	      Query_Ptr->Path_List_Ptr[i].To);*/
      Dumb_Dijkstra(Map_Ptr, Query_Ptr->Path_List_Ptr[i]);
    }

  Delete_Map(Map_Ptr);
  Delete_Query(Query_Ptr);
  fclose(Query_File_Ptr);
  fclose(Map_File_Ptr);

  return 0;
}
