#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <sqlite3.h>
#include "global.h"
#include "calendar.h"		/* for date FORMAT strings */
#include "manhat-lib/shared_calendar_util.h"
#include "manhat-lib/shared_util.h"
#include "manhat-lib/shared_cs_util.h"
#include "manhat-lib/shared_super_util.h"
#include "manhat-lib/shared_file_util.h"
#include "manhat-lib/shared_access.h"
#include "manhat-lib/shared_authenticate.h"
#include "manhat-lib/shared_lock.h"
#include "manhat-lib/shared_strtrm.h"




int event_callback(void *p_data, int num_fields, char **p_fields, char **p_col_name)
{
#define MAX_TMP_NAME 100

    char name[MAX_TMP_NAME +1];
    int start_hour;
    int end_hour;

    snprintf(name, MAX_TMP_NAME +1, "event.id");
    cs_set_value(name, p_fields[0]);
    snprintf(name, MAX_TMP_NAME +1, "event.username");
    cs_set_value(name, p_fields[1]);
    snprintf(name, MAX_TMP_NAME +1, "event.title");
    cs_set_value(name, p_fields[2]);
    snprintf(name, MAX_TMP_NAME +1, "event.desc");
    cs_set_value(name, p_fields[3]);

    snprintf(name, MAX_TMP_NAME +1, "event.year");
    cs_set_value(name, p_fields[4]);
    snprintf(name, MAX_TMP_NAME +1, "event.month");
    cs_set_value(name, p_fields[5]);
    snprintf(name, MAX_TMP_NAME +1, "event.day");
    cs_set_value(name, p_fields[6]);

    start_hour = atoi(p_fields[7]);
    if(start_hour == 0)
    {
	start_hour = 12;
        snprintf(name, MAX_TMP_NAME +1, "event.start_ampm");
        cs_set_int_value(name, 1);
    }
    else if(start_hour >= 12)
    {
        if(start_hour > 12)
            start_hour = start_hour - 12;
        snprintf(name, MAX_TMP_NAME +1, "event.start_ampm");
        cs_set_int_value(name, 2);
    }
    else 
    {
        snprintf(name, MAX_TMP_NAME +1, "event.start_ampm");
        cs_set_int_value(name, 1);
    }

    snprintf(name, MAX_TMP_NAME +1, "event.start_hour");
    cs_set_int_value(name, start_hour);

    snprintf(name, MAX_TMP_NAME +1, "event.start_min");
    cs_set_value(name, p_fields[8]);

    end_hour = atoi(p_fields[9]);
    if(end_hour == 0)
    {
	end_hour = 12;
        snprintf(name, MAX_TMP_NAME +1, "event.end_ampm");
        cs_set_int_value(name, 1);

    }
    else if(end_hour >= 12)
    {
	 if(end_hour > 12)
		end_hour = end_hour -12;
        snprintf(name, MAX_TMP_NAME +1, "event.end_ampm");
        cs_set_int_value(name, 2);

    }
    else
    {
        snprintf(name, MAX_TMP_NAME +1, "event.end_ampm");
        cs_set_int_value(name, 1);
    }

    snprintf(name, MAX_TMP_NAME +1, "event.end_hour");
    cs_set_int_value(name, end_hour);

    snprintf(name, MAX_TMP_NAME +1, "event.end_min");
    cs_set_value(name, p_fields[10]);

    snprintf(name, MAX_TMP_NAME +1, "event.type");
    cs_set_value(name, p_fields[11]);

     
    return 0;  
#undef MAX_TMP_NAME   
}




void get_one_event_from_db(int event_id,  char *db_path)
{
      char stmt[MAX_PATH +1];

      int ret =0, nrecs =0;
      sqlite3 *db;
      char *errmsg = 0;

      if(!file_exists(db_path)) 
	    cs_critical_error(ERR_DB_OPEN, "delete_an_event_from_db");

      snprintf(stmt, MAX_PATH +1, "select * from event where id=%d", event_id);

      ret = sqlite3_open(db_path, &db);
      if(ret)
	    cs_critical_error(ERR_DB_OPEN, "delete_an_event_from_db");

      ret = sqlite3_exec(db, stmt, event_callback, &nrecs, &errmsg);

      if(errmsg)
      {
	    sqlite3_close(db);
	    cs_critical_error(ERR_DB_OPEN, "delete_an_event_from_db");
      }
      sqlite3_close(db);

}

void delete_an_event_from_db(int event_id,  char *db_path)
{
      char stmt[MAX_PATH +1];

      int ret =0;
      sqlite3 *db;

      if(!file_exists(db_path)) 
	    cs_critical_error(ERR_DB_OPEN, "delete_an_event_from_db");

      snprintf(stmt, MAX_PATH +1, "delete from event where id=%d", event_id);

      ret = sqlite3_open(db_path, &db);
      if(ret)
	    cs_critical_error(ERR_DB_OPEN, "delete_an_event_from_db");

      ret = sqlite3_exec(db, stmt, 0, 0, 0);

      if(ret)
      {
	    sqlite3_close(db);
	    cs_critical_error(ERR_DB_OPEN, "delete_an_event_from_db");
      }
      sqlite3_close(db);
}



void
read_parameters (char *course, char *key)
{

   cs_get_optional_parameter("crs", course, MAX_PATH);
   cs_get_required_parameter("id", key, MAX_KEY);

}

void  do_action(CONFIG_STRUCT *conf, SESSION *user, const char *course, const char *key)
{
    char *oper = 0;
    int event_id = 0;
    char *class;
    char db_path[MAX_PATH +1];
    char view_option[MAX_PATH +1];
    int year, month, day;
    char *is_week, *is_month;
    char url[MAX_PATH +1];

    oper = hdf_get_value(global_cgi->hdf, "Query.delete", "");
    event_id = hdf_get_int_value(global_cgi->hdf, "Query.event_id", 0);
    if(event_id == 0)
	    cs_critical_error(ERR_PARAM_MISSING, "event_id");



    class = hdf_get_value(global_cgi->hdf, "Query.class", "");
    if(strlen(class))
        snprintf(db_path, MAX_PATH +1, "%s%s/%s", conf->course_path, CALENDAR_DIR, CALENDAR_DB_FNAME);
    else
        snprintf(db_path, MAX_PATH +1, "../%s/%c/%s/%s/%s", USERS_DIR, sub_dir_name(user->username), user->username, CALENDAR_DIR, CALENDAR_DB_FNAME);
    
   
     year = hdf_get_int_value(global_cgi->hdf, "Query.year", 0);
     month = hdf_get_int_value(global_cgi->hdf, "Query.month", 0);
     day = hdf_get_int_value(global_cgi->hdf, "Query.today", 0);
     is_week = hdf_get_value(global_cgi->hdf, "Query.is_week", "");
     is_month = hdf_get_value(global_cgi->hdf, "Query.is_month", "");
     cs_get_optional_parameter("view_option", view_option, MAX_PATH);
	 
    if(strlen(oper))
    {
	 delete_an_event_from_db(event_id, db_path);
	 
	 printf("Location: calendar?id=%s&crs=%s&year=%d&month=%d&today=%d&view_option=%s%s\n\n",
			 key, course, year, month, day, view_option, (strlen(is_week) > 0) ? "&is_week=yes" : 
			                  (strlen(is_month) >0) ? "&is_month=yes":"&is_day=yes");

    }
    else
    {
	snprintf(url, MAX_PATH +1, "calendar?id=%s&crs=%s&year=%d&month=%d&today=%d&view_option=%s%s",
			 key, course, year, month, day, view_option, (strlen(is_week) > 0) ? "&is_week=yes" : 
			                  (strlen(is_month) >0) ? "&is_month=yes":"&is_day=yes");
        cs_set_value("back_url", url);
	cs_set_course_info(conf);
	cs_set_int_value("title_len", MAX_EVENT_TITLE);
	cs_set_int_value("date_len", MAX_DATE_INPUT);
	cs_set_int_value("edit_event", 1);
        get_one_event_from_db( event_id,  db_path);
        cs_cgi_display ("calendar_add_event", 1);
    }

     
}



int
main ()
{
  char course[MAX_PATH +1];
  char key[MAX_KEY +1];
  SESSION user;
  CONFIG_STRUCT conf;
  char *class;

  cs_cgi_init();

  read_parameters ( course, key);

  if(strlen(course))
  {
     read_configuration_file (course, &conf);	
     validate_key (key, &user, &conf);	
  }
  else
   validate_server_key(key,&user);      /* shared_util.c */


  set_spelling();

  class = hdf_get_value(global_cgi->hdf, "Query.class", "");

  if( strlen(class) && user.group == STUDENT)
      cs_critical_error(ERR_REQUEST_DENIED, "Page can not be displayed");


  do_action(&conf, &user, course, key); 
   
  cs_cgi_destroy();                  
  return 0;		

}


