#include <sys/types.h>
#include <time.h>
#include <sys/time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "emlen.h"
#include "file.c"

PLAYERBASE_DATA *playerbase_zero;
bool found = FALSE;


void 
save_playerbase (void)
{
  FILE *fp;
  PLAYERBASE_DATA *player;
  if ((fp = fopen ("pbase.dat", "w")) == NULL)
    {
      fprintf (stderr, "Error on playerbase write.\n");
      exit (2);
    }
  for (player = playerbase_zero; player != NULL; player = player->next)
    {
      if (player->player_level == -1)
	continue;
      fprintf (fp, "%s\n", player->player_name);
      fprintf (fp, "%s\n", player->email_address);
      fprintf (fp, "%ld\n", player->player_last_login);
      fprintf (fp, "%d\n", player->player_good);
      fprintf (fp, "%d\n", player->player_level);
      fprintf (fp, "%d\n", player->player_nodelete);
    }
  fprintf (fp, "\nEND\n");
  fclose (fp);
  return;
}

void 
load_playerbase (void)
{
  FILE *fp;
  PLAYERBASE_DATA *play;
  char buff[500];
  playerbase_zero = NULL;

  if ((fp = fopen ("pbase.dat", "r")) == NULL)
    {
      return;
    }
  while (1)
    {
      strcpy (buff, fread_word (fp));
      if (!str_cmp (buff, "END"))
	break;
      play = (PLAYERBASE_DATA *) mem_alloc (sizeof (*play));
      play->next = playerbase_zero;
      playerbase_zero = play;
      strcpy (play->player_name, buff);
      strcpy (buff, fread_word (fp));
      strcpy (play->email_address, buff);
      play->player_last_login = fread_number (fp);
      play->player_good = fread_number (fp);
      play->player_level = fread_number (fp);
      play->player_nodelete = fread_number (fp);
    }

  fclose (fp);

  return;
}

void 
do_deleteold (void)
{
  time_t now;
  long maxlimit;
  char buf[500];
  struct timeval now_time;
  PLAYERBASE_DATA *pb;
  gettimeofday (&now_time, NULL);
  now = (time_t) now_time.tv_sec;
  found = TRUE;
  for (pb = playerbase_zero; pb != NULL; pb = pb->next)
    {
      if (pb->player_level == -1)
	continue;
      if (pb->player_nodelete)
	continue;
      maxlimit = pb->player_level * 140000;
      if (maxlimit > 5500000)
	maxlimit = 5500000;
      if (maxlimit < 200000)
	maxlimit = 200000;
      if ((int) (now - pb->player_last_login) > maxlimit)
	{
	  sprintf (buf, "rm \"%s%s\" &", PLAYER_DIR_2, pb->player_name);
	  system (buf);
	  sprintf (buf, "rm \"%s%s.cor\" &", PLAYER_DIR_2, pb->player_name);
	  system (buf);
	  sprintf (buf, "rm \"%s%s.tro\" &", PLAYER_DIR_2, pb->player_name);
	  system (buf);
	  pb->player_level = -1;
	}
    }
  save_playerbase ();
  return;
}

void 
do_cleanup (void)
{
  PLAYERBASE_DATA *pb;
  char buf[500];
  found = TRUE;
  system ("mkdir cleandir");
  for (pb = playerbase_zero; pb != NULL; pb = pb->next)
    {
      if (!strcmp (pb->player_name, "Blank"))
	continue;
      if (pb->player_level == -1)
	continue;
      sprintf (buf, "mv %s%s.cor cleandir", PLAYER_DIR, capitalize (pb->player_name));
      system (buf);
      sprintf (buf, "mv %s%s.tro cleandir", PLAYER_DIR, capitalize (pb->player_name));
      system (buf);
      sprintf (buf, "mv %s%s cleandir", PLAYER_DIR, capitalize (pb->player_name));
      system (buf);
    }

  sprintf (buf, "rm %s*", PLAYER_DIR);
  system (buf);
  sprintf (buf, "cp cleandir/* %s", PLAYER_DIR);
  system (buf);
  system ("rm cleandir/*");
  system ("rmdir cleandir");
  return;
}

void 
do_refresh (void)
{
  time_t now;
  struct timeval now_time;
  PLAYERBASE_DATA *pb;
  found = TRUE;
  gettimeofday (&now_time, NULL);
  now = (time_t) now_time.tv_sec;

  for (pb = playerbase_zero; pb != NULL; pb = pb->next)
    {
      pb->player_last_login = now;
    }
  save_playerbase ();
  return;
}

int 
main (int argc, char **argv)
{
  char cmd[500];
  char selection = ' ';
  bool refresh = FALSE;
  bool cleanup = FALSE;
  bool deleteold = FALSE;
  int i;
  fprintf (stderr, "Utils for Owen Emlen's Aturion Dynasty code, written by Owen Emlen.\n");
  fprintf (stderr, "Loading playerbase into memory.\n");
  load_playerbase ();

  for (i = 1; i < argc; i++)
    {
      if (!strcmp (argv[i], "-refresh"))
	refresh = TRUE;
      if (!strcmp (argv[i], "-cleanup"))
	cleanup = TRUE;
      if (!strcmp (argv[i], "-deleteold"))
	deleteold = TRUE;
    }

  if (refresh)
    do_refresh ();
  if (cleanup)
    do_cleanup ();
  if (deleteold)
    do_deleteold ();

  if (!found)
    {
      fprintf (stderr, "Valid options are: -refresh -cleanup -deleteold\n");
      fprintf (stderr, "-----------------------------------------------\n");
      fprintf (stderr, "-refresh     sets all to have just 'logged in'\n");
      fprintf (stderr, "-cleanup     removes all people not on record in the pbase.\n");
      fprintf (stderr, "-deleteold   removes all people who haven't played in a while.\n");
      return 1;
    }

  return 0;
}