/* This holds useful procedures for debugging the model*/

#include <stdio.h>
#include "types.h"
#include "debug.h"

  /*This prints out the "fast_metabolism" in an easy to read form.*/

void print_fast_metab(Reaction *react)
{
#ifdef TRANS
   printf(" ---in print_fast_metab---\n");
#endif

   printf("      Fast Metabolism: ");
   while (react != NULL)
     {
       if (react->reaction_type == BREAKDOWN)
	 printf("%d -> %d, ", react->first_reactant,
		react->second_reactant);
       else printf("%d + %d, ", react->first_reactant,
		   react->second_reactant);
       
       react = react->next_reaction;
     }
   printf("\n");
   
#ifdef TRANS
   printf(" ---end print_fast_metab---\n");
#endif
}


  /*prints out the entire state of a critter*/

void print_critter(Critter *current)
{
  int j;
#ifdef TRANS
   printf(" ---in print_critter_metas---\n");
#endif

     /* Critter ID info */
      printf(" critter id: %d, parent id: %d\n",
             current->id_num, current->parent_id);

     /* genetic material */
      printf("      hide_len: %d, hide: ",
             current->hide_len);
      for (j=0; j<current->hide_len; j++)
         printf("%d", current->hide[j]);
      printf("\n");
      printf("      seek_len: %d, seek: ",
             current->seek_len);
      for (j=0; j<current->seek_len; j++)
         printf("%d", current->seek[j]);
      printf("\n");
      printf("      meta_len: %d, metabolism: ",
             current->meta_len);
      for (j=0; j<current->meta_len; j++)
         printf("%d", current->metabolism[j]);
      printf("\n");
      print_fast_metab(current->fast_metabolism);
     /* metabolism stuff */
      printf("      In gut: ");
      for (j=0; j<NUM_METABOLITES; j++)
         printf(" %d", current->gut[j]);
      printf("\n");
      printf("      amt_food: %d\n", current->amt_food);

     /* Critter's current state */
      printf("      energy: %d\n", current->energy);
      printf("      age: %d\n", current->age);
      printf("      para_age: %d\n", current->para_age);
      printf("      num_offspring: %d\n", current->num_offspring);
      printf("      num_times_host: %d\n", current->num_times_host);
      printf("      num_times_para: %d\n", current->num_times_para);
      printf("      num_curr_para: %d\n", current->num_curr_para);


#ifdef TRANS
   printf(" ---end print_critter_metas---\n");
#endif
}


  /*This prints out the environment and the entire state of every */
  /*critter in the population*/

void print_population(Population *the_population)
{
  Critter *current;
  int j;

   printf(" There are currently %d critter(s) in the population.\n",
	  the_population->current_size);
   printf(" ** Environment: ");
   for (j=0; j<NUM_METABOLITES; j++)
      printf(" %d", the_population->environment[j]);
   printf("\n");
   printf(" ** From linked list:\n");
   current = the_population->critters;
   while (current != NULL)
      {
	print_critter(current);
	current = current->p_next;
      }

}

  /*This just prints the ID numbers of the critters in the population.*/

void print_brief_pop(Population *the_population)
{
  Critter *current;

   printf(" There are currently %d critter(s) in the population.\n",
	  the_population->current_size);

   printf(" Popluation ID's: ");
   current = the_population->critters;
   while (current != NULL)
      {
	printf("%d ", current->id_num);
	current = current->p_next;
      }
  printf("\n");

}



  /* This prints out the list of metabolizers that haven't yet */
  /* finished working through their metabolism.  If no one is printed */
  /* out that means that everyone has finished their metabolism or */
  /* there is no one in the population. */

void print_metabolizers(Population *the_population)
{
  Critter *current;
  int j;

   current = the_population->metabolizer;

   printf("Environment: ");
   for (j=0; j<NUM_METABOLITES; j++)
      printf(" %d", the_population->environment[j]);
   printf("\n");


  if (current == NULL) 
    printf("The whole population is about to metabolize.\n");

   while (current != NULL)
      {
	print_critter(current);
	current = current->next_metabolizer;
      }

}


  /*This just lists the ID numbers of the current metabolizers.*/

void print_brief_metabolizers(Population *the_population)
{
  Critter *current;

   printf(" There are currently %d critter(s) in the population.\n",
	  the_population->current_size);

   printf("Metabolizer ID's: ");
   current = the_population->metabolizer;
   while (current != NULL)
      {
	printf("%d ", current->id_num);
	current = current->next_metabolizer;
      }
  printf("\n");

}

Boolean check_metabolizer_ptrs(Population *the_population)
{
  Critter *current;
  Boolean answer;

  for(current = the_population->critters, answer = TRUE;
      current != NULL;
      current = current->p_next)
    {
      if (current->next_metabolizer != NULL || 
	  current->prev_metabolizer != NULL)
	{
	  printf("Critter %d has a non-null metabolizer pointer\n", 
		 current->id_num);
	  answer = FALSE;
	}
    }

  return answer;
}


void print_gut(Gut *a_gut)
{
  int j;

   printf(" Gut contents: ");
   for (j=0; j<NUM_METABOLITES; j++)
      printf(" %d", a_gut[j]);
   printf("\n");
}
