#include <stdio.h>
#include <string.h>
#include <unistd.h>		/* for unlink, mktmp ... */
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
              

#include "global.h"


#include "manhat-lib/shared_cs_util.h"
#include "manhat-lib/shared_util.h"
#include "manhat-lib/shared_strtrm.h"
#include "manhat-lib/shared_system_data.h"
#include "manhat-lib/shared_survey_string.h"
#include "manhat-lib/shared_server_string.h"
#include "manhat-lib/shared_central_user.h"

void write_data_to_xml(char *file_path, char *subdir, char *internal, char *course_no, char *semester, char *title, SESSION *user);

static void
read_parameters( char *key )
{
   cs_get_required_parameter ("id", key, MAX_KEY);       /* shared_cs_util.c */
}


void set_data(SESSION *user) 
{
   cs_set_int_value("MAX_COURSE_TITLE", MAX_COURSE_TITLE); 
}




void get_internal_name(char *username,  char *valid_internal, int istemplate)
{
  char path[MAX_PATH +1];
  int i, done;
  
  
  for(i=0, done = 0; !done; i++)
   {     
      snprintf(valid_internal, MAX_PATH +1, "%s%s%d", istemplate == 1 ? "T":"", username, i);
     
     if(istemplate)
         snprintf(path, MAX_PATH +1, "%sT%s/%s", TEMPLATE_PATH,  username, valid_internal); 
     else
       snprintf(path, MAX_PATH +1, "%s%s/%s", COURSE_PATH, system_data_str("FACULTY_COURSE_CREATE_GROUP"), valid_internal); 

     done = !file_exists(path);    /* shared_file_util.c */
         
   }
}
	
	
	
	
	
	
	
void
write_data_to_xml(char *file_path, char *subdir, char *internal, char *course_no, char *semester, char *title, SESSION *user)
{
    FILE *fp;
    char firstname[MAX_NAME +1];
    char lastname[MAX_NAME +1];
    char *ptr;
    char temp_title[MAX_PATH];

    snprintf(temp_title, MAX_PATH, "%s", title);
    ptr = strrchr(user->realname, ' ');
    if(ptr)
    {
       *ptr = '\0';
       strncpy(firstname, user->realname, MAX_NAME +1);
       ptr++;
       strncpy(lastname, ptr, MAX_NAME +1);
       ptr--;
       *ptr = ' ';
    }
    else
    {
       strncpy(firstname, user->realname, MAX_NAME +1);
       strncpy(lastname, user->realname, MAX_NAME +1);
    }


    fp = fopen(file_path, "w");
    if(!fp)
	cs_critical_error(ERR_FOPEN_WRITE_FAILED, file_path);

    /* replace_sp() is in shared_survey_string.c */
    
    fprintf(fp,"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n");
    fprintf(fp, "<!-- Manhattan course data -->\n");
    fprintf(fp, "<courses>\n");
    fprintf(fp, "   <course subdir=\"%s\" id=\"%s\">\n", replace_sp(subdir), replace_sp(internal));
    fprintf(fp, "      <course_no>%s</course_no>\n", replace_sp(course_no));
    fprintf(fp, "      <course_title>%s</course_title>\n", replace_sp(temp_title));
    fprintf(fp, "      <teacher_title>%s</teacher_title>\n", replace_sp(user->realname));
    fprintf(fp, "      <term>%s</term>\n", replace_sp(semester));
    fprintf(fp, "      <users>\n");
    fprintf(fp, "      <user id=\"%s\">\n", replace_sp(user->id));
    fprintf(fp, "        <first>%s</first>\n", replace_sp(firstname));
    fprintf(fp, "        <last>%s</last>\n", replace_sp(lastname));
    fprintf(fp, "        <username></username>\n");
    fprintf(fp, "        <group>faculty</group>\n"), 
     fprintf(fp, "      </user>\n");
    fprintf(fp, "        </users>\n");
    fprintf(fp, "     </course>\n");
    fprintf(fp, "</courses>\n");

    fclose(fp);

}
	
	
			    
void create_course(SESSION *user, char *title, char *key) 
{
   char internal[MAX_PATH +1];
   char course_no[MAX_PATH +1];
   char file_path[MAX_PATH +1];
   char *group;
   char *semester;
   int istemplate = 0;
   char *temp;
   char server_string[MAX_PATH];

   temp = hdf_get_value(global_cgi->hdf, "Query.template", "");
   
   if(strlen(temp) && !strcmp(temp, "yes"))
       istemplate = 1;	

   get_internal_name(user->username, internal, istemplate);
   group = system_data_str("FACULTY_COURSE_CREATE_GROUP");
   semester = system_data_str("FACULTY_COURSE_CREATE_SEMESTER");
   snprintf(course_no, MAX_PATH +1, "%s",  internal);
   

   snprintf(file_path, MAX_PATH +1, "%sCGI_%s", TMP_PATH, internal);
   write_data_to_xml(file_path, group, internal, course_no, semester, title, user);

   get_server_string(server_string, MAX_PATH);

   printf("Location: %s/%s/%s?id=%s&roster_path=%s&c1_subdir=%s&c1_new_id=%s&c1_orig_id=%s&c1_type=%s&count=1&c1_subdir_or=%s&from=self\n\n",
          server_string, system_data_str("SBIN_ALIAS"), "super_xml_course_create", key, file_path, group, internal, internal,
          (istemplate == 0 ? "Normal": "Template"), group);


}




static void  
html_escape_parameter(char *target, int maxlen, const char *element_name)
{
  char *escaped_string;

  cs_html_escape_string(target, &escaped_string);  /* shared_cs_util.c */
  if(strlen(escaped_string) > maxlen)
    {
      free(escaped_string);
      cs_critical_error(ERR_PARAM_LONG, element_name);
    }
  strncpy(target, escaped_string, maxlen + 1);
  free(escaped_string);
  
}





static int 
group_valid(char *group)
{
 char *ptr;
 
  if(!*group || (strlen(group) > 8))
      return 0;
      
  if(*group == 'T') 
      return 0;
          
   for(ptr = group; *ptr; ptr++)
   {
       if((*ptr != '_')  && !isdigit(*ptr) && !isalpha(*ptr))
       {
         return 0;
       }
    }
    
  return 1;
}


     


int
main()
{
 
 char key [MAX_KEY + 1];
 SESSION user;
 char title[MAX_COURSE_TITLE + 1];
 char allow_classroom_creation[2];
 char group[MAX_FILENAME + 1];
 char semester[MAX_SEMESTER + 1];
    
   cs_cgi_init();    /* shared_cs_util.c */

   read_parameters(key);
   validate_server_key(key,&user);   	/* shared_util.c */


   /* user must have the PREF_ALLOW_CLASSROOM_CREATION privilege enabled */
   get_user_pref(user.username, PREF_ALLOW_CLASSROOM_CREATION, allow_classroom_creation, 1);   /* shared_central_user.c  - also see global.h for #def of PREF_ALLOW_CLASSROOM_CREATION */
   if(*allow_classroom_creation != '1' )
	cs_critical_error(ERR_REQUEST_DENIED, "");

   /* did system admin activate the ENABLE_FACULTY_COURSE_CREATE system parameter? */
   if(!system_data_int("ENABLE_FACULTY_COURSE_CREATE"))
       cs_critical_error(ERR_FAC_COURSE_CREATION_NOT_ENABLED, "");
       
   /* did system admin enter a good course group system parameter? */
   strncpy(group, system_data_str("FACULTY_COURSE_CREATE_GROUP"), MAX_FILENAME + 1);
   *(group + MAX_FILENAME) = '\0';
   strtrm(group);    /* shared_strtrm.c */
   if(!group_valid(group))
      cs_critical_error(ERR_FAC_COURSE_CREATION_GROUP_INVALID, group);
   
   /* did system admin enter a good semester parameter? */
   strncpy(semester, system_data_str("FACULTY_COURSE_CREATE_SEMESTER"), MAX_SEMESTER + 1);
   *(semester + MAX_SEMESTER) = '\0';
   html_escape_parameter(semester, MAX_SEMESTER, "FACULTY_COURSE_CREATE_SEMESTER");


   strncpy(title, hdf_get_value(global_cgi->hdf, "Query.course_title", ""), MAX_COURSE_TITLE + 1);
   *(title + MAX_COURSE_TITLE) = '\0';
   strtrm(title);   /* shared_strtrm.c */
   html_escape_parameter(title, MAX_COURSE_TITLE, "title");
   if(strlen(title))
        create_course(&user, title, key); 
   else
   {
     set_data(&user); 
     cs_cgi_display ("admin_create_course_form", 1);    /* shared_cs_util.c */
   } 
   
   
   cs_cgi_destroy();        		/* shared_cs_util.c */
   return 0;
}


