#include <stdio.h>
#include <string.h>

#include "global.h"


#include "manhat-lib/shared_util.h"
#include "manhat-lib/shared_cs_util.h"
#include "manhat-lib/shared_news_util.h"
#include "manhat-lib/shared_lock.h"
#include "manhat-lib/shared_translate_url.h"
#include "manhat-lib/shared_access.h"
#include "manhat-lib/shared_strtrm.h"


static void
read_parameters (char *course,
		 char *key,
		 int *grp,
                 long *offset,
                 int *topic,
	 	 char *folder_name)
{
  char msg[MAX_FILENAME + 1];

  cs_get_required_parameter ("crs", course, MAX_PATH);  /* shared_cs_util.c */
  cs_get_required_parameter ("id", key, MAX_KEY); 	/* shared_cs_util.c */

  cs_get_required_parameter ("topic", msg, MAX_FILENAME);
  *topic = atoi(msg);
  
  cs_get_required_parameter ("grp", msg, MAX_FILENAME);	/* shared_cs_util.c */
  *grp = atoi (msg);

  cs_get_required_parameter ("loc", msg, MAX_FILENAME);	/* shared_cs_util.c */
  *offset = atol (msg);

  cs_get_required_parameter("folder_name", folder_name, MAX_SUBJECT);
  strtrm(folder_name);
  
  if(!*folder_name)
     cs_critical_error(ERR_GENERAL_ERROR, "folder name is empty");



}







static void
rename_folder (long offset, char *new_folder_name)
{
  int fd;
  FILE *fp;
  char inbox_path[MAX_PATH + 1];
  CENTRAL_INBOX_RECORD msg;
  

  snprintf (inbox_path, MAX_PATH + 1, "%s/%s", central_discussion_path, INBOX_FNAME);
  
  fp = fopen(inbox_path,"r+");
  if(!fp)
    cs_critical_error(ERR_FOPEN_READ_FAILED, "inbox_path");
  
  fd = fileno(fp); 
  get_exclusive_lock(fd, 1);                      /* shared_lock.c */


  /* read the msg at 'offset' */
  if(fseek(fp, offset, SEEK_SET))
      cs_critical_error(ERR_FSEEK_FAILED, inbox_path);
  if(fread(&msg, sizeof(CENTRAL_INBOX_RECORD),1,fp) != 1)
      cs_critical_error(ERR_FREAD_FAILED, inbox_path);

  if(!is_folder(&msg))   /* shared_news_util.c */
      cs_critical_error(ERR_NOT_FOLDER, msg.info.subject);

  /* copy the new folder name to the record */
   strncpy(msg.info.subject, new_folder_name, MAX_SUBJECT + 1);
   *(msg.info.subject + MAX_SUBJECT) = '\0';
   
   /*write the record back to the file */
  if(fseek(fp, offset, SEEK_SET))
      cs_critical_error(ERR_FSEEK_FAILED, inbox_path);
  if(fwrite(&msg, sizeof(CENTRAL_INBOX_RECORD),1,fp) != 1)
      cs_critical_error(ERR_FWRITE_FAILED, inbox_path);

   
  release_lock(fd);   /* shared_lock.c */
  fclose(fp);
  
}









int
main (void)
{
  char course[MAX_PATH + 1];		/* from crs=? command line */
  char key[MAX_KEY + 1];		/* from id=? command line */
  int grp;				/* from grp=? cmd line */
  long offset;                          /* from loc=? cmd line */
  int topic;                            /* from topic=? cmd line */
  char folder_name[MAX_SUBJECT + 1];		/* from from=? command line */

  SESSION user;
  CONFIG_STRUCT conf;		

  cs_cgi_init();			/* shared_cs_util.c */

  read_parameters (course, key,  &grp,  &offset, &topic, folder_name);
  read_configuration_file (course, &conf);	/* shared_util.c */
  validate_key (key, &user, &conf);		/* shared_util.c */

  if(!has_write_permission(&user, &conf))   /* shared_access.c */
      access_denied_error();
      
  /* only FACULTY can rename folders, and in modules that support it
  */
  if((user.group != FACULTY) || !group_uses_folders(grp))   /* shared_news_util.c */
      cs_critical_error(ERR_REQUEST_DENIED, "");

  set_discussion_names (conf.course_path, user.username, grp);	/* shared_news_util.c */

  rename_folder (offset, folder_name);

  printf("Location: news_topic?crs=%s&id=%s&grp=%d#%d\n\n", course,key,grp,topic);

  cs_cgi_destroy();			/* shared_cs_util.c */
  return 0;
}



