#include "shared_system_data.h"

HDF *global_system_conf_data = 0;
HDF *global_system_default_data = 0;

void load_system_data()
{
   char path[MAX_PATH +1];

   snprintf(path, MAX_PATH +1, "%s/%s", ETC_DIR, ETC_CONF_DATA_FNAME);
   hdf_init(&global_system_conf_data);

   if(hdf_read_file(global_system_conf_data, path) != STATUS_OK)
	     cs_critical_error(ERR_LOAD_SYSTEM_DATA, path);
}




char * system_data_str(char *name)
{
   char query[100];

   if(!global_system_conf_data)
       load_system_data();
   snprintf(query, 100, "system.%s", name);
   *(query + 99) = '\0';

   return hdf_get_value(global_system_conf_data, query, "");
}






int system_data_int( char *name)
{
   char query[100];

   if(!global_system_conf_data)
             load_system_data();

   snprintf(query, 100, "system.%s", name);
   *(query + 99) = '\0';

   return hdf_get_int_value(global_system_conf_data, query, 0);
}



void free_system_data()
{
	
   if(global_system_conf_data)
	hdf_destroy(&global_system_conf_data);
}




void write_system_data()
{
   char path[MAX_PATH +1];

   snprintf(path, MAX_PATH +1, "%s/%s", ETC_DIR, ETC_CONF_DATA_FNAME);
   hdf_write_file(global_system_conf_data, path);
}




int is_system_data_changed(char *name, char *value)
{
    char query[100];
    char *current_value;

    snprintf(query, 100, "system.%s", name);
    current_value = hdf_get_value(global_system_conf_data, query, "");
    if(strlen(current_value) ==0 || strcmp(value, current_value))
    {
	 hdf_set_value(global_system_conf_data, query, value);
	 return 1;
    }
    return 0;
}




void get_alias_name(char *temp, char *sbin)
{
   char *ptr;

   if(*temp == '/')
     *temp = '\0';
   temp++;
   ptr = strchr(temp, '/');
   if(ptr)
      *ptr = '\0';
   strncpy(sbin, temp, MAX_PATH +1);
}



void guess_image(char *bin_name, char *image)
{
     char *ptr;
     char temp[MAX_PATH +1];

      strncpy(temp, bin_name, MAX_PATH +1);

     ptr = strchr(temp, '-');
     if(!ptr)
	 *image = '\0';
     else
     {
	*ptr = '\0';
	snprintf(image, MAX_PATH +1, "/%s-images/", temp);
     }
}




void guess_bin_alias(char *sbin_name, char *bin)
{
    char *ptr;
    char temp[MAX_PATH +1];

    strncpy(temp, sbin_name, MAX_PATH +1);
    ptr = strchr(temp, '-');

    if(!ptr)
       *bin = '\0';
    else
    {
        *ptr = '\0';
	snprintf(bin, MAX_PATH +1, "%s-bin", temp);
    }
}



void guess_sbin_alias(char *bin_name, char *sbin)
{
    char *ptr;
    char temp[MAX_PATH +1];


    strncpy(temp, bin_name, MAX_PATH +1);
    ptr = strchr(temp, '-');

    if(!ptr)
       *sbin = '\0';
    else
    {
        *ptr = '\0';
	snprintf(sbin, MAX_PATH +1, "%s-sbin", temp);
    }
}




void update_bin_sbin_image_alias()
{
   char sbin[MAX_PATH +1];
   char bin[MAX_PATH +1];
   char image_path[MAX_PATH +1];
   char *temp;
   char name[MAX_PATH +1];

   temp = hdf_get_value(global_cgi->hdf, "CGI.RequestURI", "");
   if(strlen(temp) && strlen(temp)>1)
   {
      if(strstr(temp, "sbin"))
      {
	     get_alias_name(temp, sbin);
             snprintf(name, MAX_PATH +1, "system.SBIN_ALIAS");
	     hdf_set_value(global_system_default_data, name, sbin);

             guess_image(sbin, image_path);
	     if(strlen(image_path))
	     {
                snprintf(name, MAX_PATH +1, "system.IMAGE_PATH");
	        hdf_set_value(global_system_default_data, name, image_path);
	     }
             guess_bin_alias(sbin, bin);
	     if(strlen(bin))
	     {
                snprintf(name, MAX_PATH +1, "system.ALIAS");
	        hdf_set_value(global_system_default_data, name, bin);
	     }

      }
      else
      {
	     get_alias_name(temp, bin);
             snprintf(name, MAX_PATH +1, "system.ALIAS");
	     hdf_set_value(global_system_default_data, name, bin);
	     
             guess_image(bin, image_path);
	     if(strlen(image_path))
	     {
                snprintf(name, MAX_PATH +1, "system.IMAGE_PATH");
	        hdf_set_value(global_system_default_data, name, image_path);
	     }

             guess_sbin_alias(bin, sbin);
	     if(strlen(sbin))
	     {
                 snprintf(name, MAX_PATH +1, "system.SBIN_ALIAS");
	         hdf_set_value(global_system_default_data, name, sbin);
	     }


      }
   }
}





void update_conf_file()
{
  HDF *obj = hdf_get_child(global_system_default_data, "system");
  HDF *temp_data;

  char name[MAX_PATH +1];
  char path[MAX_PATH +1];
  char *value;


  snprintf(path, MAX_PATH +1, "%s/%s", ETC_DIR, ETC_CONF_DATA_FNAME);
  if(!file_exists(path))     /* no manhat.conf file */
  {
      update_bin_sbin_image_alias();
  }
  else                       /* manhat.conf file exists. update default system data with manhat.conf data. */
  {
      hdf_init(&temp_data);
      if(hdf_read_file(temp_data, path) != STATUS_OK)
	     cs_critical_error(ERR_LOAD_SYSTEM_DATA, path);
      while(obj)
      {
         snprintf(name, MAX_PATH +1, "system.%s", obj->name);
         value = hdf_get_value(temp_data, name, "");
         if(strlen(value) >0 && strcmp(value, obj->value))
         {
	     
             hdf_set_value(global_system_default_data, name, value);
	 }
        obj = obj->next;
      }
     hdf_destroy(&temp_data);
  }

  hdf_write_file(global_system_default_data, path);
  hdf_destroy(&global_system_default_data);

}


void default_conf_data()
{
  hdf_init(&global_system_default_data);

  hdf_set_value(global_system_default_data, "system.EXIT_URL",  "doorstep");
  hdf_set_value(global_system_default_data, "system.INSTALLATION_TITLE", "The Manhattan Virtual Classroom"); 
  
  hdf_set_int_value(global_system_default_data, "system.MELANGE_PORT",  6661);
  
  hdf_set_value(global_system_default_data, "system.IMAGE_PATH", "/manhat-images/");
  
  hdf_set_value(global_system_default_data, "system.ALIAS" ,  "manhat-bin");
  hdf_set_value(global_system_default_data, "system.SBIN_ALIAS",  "manhat-sbin");

  hdf_set_int_value(global_system_default_data, "system.HTTP_PORT",  80);
  hdf_set_int_value(global_system_default_data, "system.USE_HTTPS",  0);
  hdf_set_int_value(global_system_default_data, "system.HTTPS_PORT",  443);
  hdf_set_int_value(global_system_default_data, "system.INCLUDE_SERVER_PORT_IN_URLS",  0);

  hdf_set_int_value(global_system_default_data, "system.COOKIES_ENABLED",  0);
  hdf_set_int_value(global_system_default_data, "system.REQUIRE_COOKIES",  0);
  hdf_set_int_value(global_system_default_data, "system.SECURE_COOKIES",  0);

  hdf_set_int_value(global_system_default_data, "system.SUPER_COOKIES_ENABLED",  0);
  hdf_set_int_value(global_system_default_data, "system.SUPER_REQUIRE_COOKIES",  0);
  hdf_set_int_value(global_system_default_data, "system.SUPER_SECURE_COOKIES",  0);


  hdf_set_int_value(global_system_default_data, "system.IP_CHECK_ENABLED",  0);
  hdf_set_int_value(global_system_default_data, "system.SUPER_IP_CHECK_ENABLED", 0);

  hdf_set_int_value(global_system_default_data, "system.ENABLE_DNS_LOOKUPS",  1);
  hdf_set_int_value(global_system_default_data, "system.LAST_N_DIGITS_OF_ID",  4);
  hdf_set_int_value(global_system_default_data, "system.MAX_KEY_EXPIRE",  14400);
  hdf_set_int_value(global_system_default_data, "system.MAX_CLIPBOARD_EXPIRE",  259200);

  hdf_set_value(global_system_default_data, "system.DOW_DATE_TIME_FORMAT",  "%a %m/%d/%Y %I:%M %p");
  hdf_set_value(global_system_default_data, "system.DOW_DATE_FORMAT",  "%a %m/%d/%Y");
  hdf_set_value(global_system_default_data, "system.LONG_DOW_DATE_FORMAT",  "%A %B %e %Y");
  hdf_set_value(global_system_default_data, "system.TIME_FORMAT",  "%I:%M %p");
  hdf_set_value(global_system_default_data, "system.TIME_DATE_FORMAT", "%I:%M %p %m/%d/%Y");
  hdf_set_value(global_system_default_data, "system.DATE_FORMAT", "%m/%d/%Y");

  hdf_set_int_value(global_system_default_data, "system.HIDE_ANONYMOUS_TIMES",  1);

  hdf_set_int_value(global_system_default_data, "system.ALLOW_PASSWORD_RESET",  1);
  hdf_set_int_value(global_system_default_data, "system.ALLOW_STUDENT_CHANGE_PASSWORD",  1);
  hdf_set_int_value(global_system_default_data, "system.ALLOW_TEACHER_CHANGE_PASSWORD", 1);
  
  hdf_set_int_value(global_system_default_data, "system.ALLOW_DELETE_OTHER_TEACHER_MSGS", 1);

  hdf_set_int_value(global_system_default_data, "system.ALLOW_POST_OFFICE_MSGS_TO_SELF", 0); 
  hdf_set_int_value(global_system_default_data, "system.SHOW_REDSTAR_ON_CHAT_BUTTON",  0);
  hdf_set_int_value(global_system_default_data, "system.ALLOW_TEACHER_CREATE_NEW_ACCOUNT",  0);
  hdf_set_int_value(global_system_default_data, "system.ALLOW_TEACHER_SELECT_USER_BY_COURSE",  0);

  hdf_set_int_value(global_system_default_data, "system.MAX_LOGIN_LOG_SIZE",  250000);

  hdf_set_int_value(global_system_default_data, "system.ENABLE_VIEW_EDIT_BIO_BUTTON",  1);

  hdf_set_int_value(global_system_default_data, "system.SPELL_CHECK_ENABLED",  1);
  hdf_set_value(global_system_default_data, "system.ASPELL_PATH",  "aspell");
  hdf_set_value(global_system_default_data, "system.ASPELL_ARGS", "-a --lang=en_US");

  hdf_set_int_value(global_system_default_data, "system.ENABLE_EDITOR_WIDTH_SELECTION",  1);
  hdf_set_int_value(global_system_default_data, "system.EDITOR_WIDTH_STANDARD",  70);
  hdf_set_int_value(global_system_default_data, "system.EDITOR_WIDTH_MEDIUM",  85);
  hdf_set_int_value(global_system_default_data, "system.EDITOR_WIDTH_LARGE", 105);
  hdf_set_int_value(global_system_default_data, "system.EDITOR_WIDTH_XLARGE",  120);

  hdf_set_int_value(global_system_default_data, "system.DEFAULT_THEME",  0);
  hdf_set_int_value(global_system_default_data, "system.USE_TEXTAREA_HARD_WRAP",  0);
  hdf_set_int_value(global_system_default_data, "system.RECORD_RUN_TIME",  1);
  hdf_set_int_value(global_system_default_data, "system.ENABLE_FACULTY_COURSE_REQUEST", 0); 

  hdf_set_value(global_system_default_data, "system.MANHATTAN_SERVER_IP",  "");
  hdf_set_int_value(global_system_default_data, "system.HIDE_MANHATTAN_USERNAMES", 0); 

  hdf_set_value(global_system_default_data, "system.TESTPILOT_SERVER",  "");
  hdf_set_value(global_system_default_data, "system.TESTPILOT_SCRIPT_PATH",  "testpilot.php"); 
  hdf_set_value(global_system_default_data, "system.TESTPILOT_ADMIN_SCRIPT_PATH", "testpilot_admin.php"); 


  
  hdf_set_int_value(global_system_default_data, "system.ENABLE_FACULTY_COURSE_CREATE", 0); 
  hdf_set_value(global_system_default_data, "system.FACULTY_COURSE_CREATE_GROUP", "SELF"); 
  hdf_set_value(global_system_default_data, "system.FACULTY_COURSE_CREATE_SEMESTER", "Communications Arena"); 
  hdf_set_value(global_system_default_data, "system.MP3PLAYER", "JW"); 
}




void get_default_conf()
{
   default_conf_data();
   update_conf_file();
}
