/*
 * Creation, deletetion, editing of various things
 */
#include "main.h"
#include "modify.h"

#ifdef LOG
#include <xlog.h>
#endif

#include <stdio.h>

#define C_VERSION 1

/* local functions */
void fread_main( CAMP *c, FILE *fp );
/* /local */

/*
 * Save an allocated campaign, return FALSE if failed, return TRUE otherwise
 */
bool save_campaign( CAMP *c )
{
  FILE *fp = NULL;

  if ( c == NULL )
  {
#ifdef LOG_CAMPAIGN
    L( "Save_Campaign", "Null campaign", 0 );
#endif
    return FALSE;
  }
  
  if ( CHECK_STR(c->filename) ) /* filename doesnt exist */
  {
#ifdef LOG_CAMPAIGN
    L( "Save_Campaign", "Null filename", 0 );
#endif
    return FALSE;
  }

  if ( (fp = fopen( c->filename, "w")) == NULL )
   return FALSE;

  fprintf( fp, "#CAMPAIGN\n\n" );
  fprintf( fp, "Version                %d\n",  C_VERSION );
  fprintf( fp, "Filename               %s~\n", c->filename );
  fprintf( fp, "Author                 %s~\n", c->author );
  fprintf( fp, "Name                   %s~\n", c->name );
  fprintf( fp, "World                  %s~\n", c->world_name );
  fprintf( fp, "LLow                   %d\n", c->level_range[0] );
  fprintf( fp, "LHigh                  %d\n", c->level_range[1] );
  fprintf( fp, "EndMain\n\n" );

  fprintf( fp, "#END\n" );
  
  fclose(fp);
  
  /* not modified anymore! */
  if ( c->modified == TRUE )
   c->modified = FALSE;
  
  return TRUE;
}


/*
 * Close an open and allocated campaign, return FALSE if failed, return TRUE otherwise
 */
bool close_campaign( CAMP *c )
{
  if ( c == NULL )
  {
#ifdef LOG_CAMPAIGN
    L( "Close_Campaign", "Null campaign", 0 );
#endif
    return FALSE;
  }
  
  /* dispose is null safe, get rid of allocated strings */
  DISPOSE(c->filename);
  DISPOSE(c->author);
  DISPOSE(c->name);
  DISPOSE(c->world_name);

  /* trash the campaign */
  DISPOSE(c);
  
  c = NULL; /* for good measure */

  return TRUE;
}

/*
 * Load campaign data from a file, returns pointer to daya
 */
CAMP *open_campaign( FILE *fp )
{
    CAMP *c = NULL;

    if ( fp == NULL )
    {
#ifdef LOG
        L( "Open_Campaign", "Null File!", 0 );
#endif
        return NULL;
    }

    if ( c == NULL ) /* alloc data if need be */
        CREATE( c, CAMP, 1 );

    for ( ; ; )
    {
        char letter;
        char *word;

        letter = fread_letter( fp );

        if ( letter != '#' )
        {
#ifdef LOG
            L( "Open_Campaign", "# not found.", 0 );
#endif
        	break;
        }

        word = fread_word( fp );

        if ( !stricmp( word, "CAMPAIGN" ) )
        {
        	fread_main( c, fp );
        	break;
        }
        else
        if ( !strcmp( word, "END"	) )
            break;
        else
        {
#ifdef LOG
            L( "Open_Campaign", "bad section: %s", word );
#endif
        	break;
        }
    }

    fclose( fp );
    return c;
}

#ifdef SKEY
#undef SKEY
#endif

#define SKEY( literal, field, value )					\
				if ( !stricmp( word, literal ) )	\
				{					\
				    field  = value;			\
				    fMatch = TRUE;			\
				    break;				\
				}

/* read functions */

/*
 * Read in main campaign data
 */
void fread_main( CAMP *c, FILE *fp )
{
    short version;
    char *word;
    bool fMatch;

    if ( c == NULL )
    {
#ifdef LOG
      L( "Fread_Main", "Null Campaign", 0 );
#endif
      return;
    }
    
    for ( ; ; )
    {
    	word   = feof( fp ) ? "EndMain" : fread_word( fp );
    	fMatch = FALSE;

    	switch ( toupper(word[0]) )
    	{
            case 'A':
                 SKEY( "Author", c->author, fread_string( fp ) );
                 break;
                 
            case 'E':
                 if ( !stricmp(word, "EndMain" ) )
                 {
                   if ( c->level_range[0] > 40 )
                    c->level_range[0] = 40;

                   if ( c->level_range[1] > 40 )
                    c->level_range[1] = 40;

                   c->modified = FALSE;

                   return; /* end function */
                 }
                 break;

        	case 'F':
           	     SKEY( "Filename",	c->filename,	fread_string( fp ) );
        	     break;
        	     
            case 'N':
                 SKEY( "Name", c->name, fread_string( fp ) );
                 break;

            case 'V':
                 SKEY( "Version", version, fread_number( fp ) );
                 break;
                 
            case 'W':
                 SKEY( "World", c->world_name, fread_string( fp ) );
                 break;
                 
            case 'L':
                 SKEY( "LLow", c->level_range[0], fread_number( fp ) );
                 SKEY( "LHigh", c->level_range[1], fread_number( fp ) );
                 break;
    	}

    	if ( !fMatch )
    	{
#ifdef LOG
            L( "Fread_Main", "No match: %s", word );
#endif
    	}
    }
}