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

#include "global.h"

#include "manhat-lib/shared_util.h"
#include "manhat-lib/shared_super_util.h"
#include "manhat-lib/shared_authenticate.h"
#include "manhat-lib/shared_cs_util.h"
#include "manhat-lib/shared_system_data.h"
#include "manhat-lib/shared_strtrm.h"
#include "manhat-lib/shared_person_list.h"
#include "manhat-lib/shared_testpilot_util.h"

P_NODE *get_new_node(char *line)
{
   char *ptr, *ptr2;

   P_NODE *p_node = (P_NODE*)malloc(sizeof(P_NODE));
   if(!p_node)
      cs_critical_error(ERR_MALLOC_FAILED, "super_process_request");
   ptr = strchr(line, ',');
   if(!ptr)
      cs_critical_error(ERR_REQUEST_FORMAT_ERROR, "super_process_request");
   *ptr = '\0';
   snprintf(p_node->data.id, MAX_ID +1, "%s", line);
   ptr++;
   ptr2 = strchr(ptr, ',');
   if(!ptr2)
      cs_critical_error(ERR_REQUEST_FORMAT_ERROR, "super_process_request");
   *ptr2 = '\0';
   snprintf(p_node->data.password, MAX_PASSWORD +1, "%s", ptr);
   ptr2++;
   ptr = strchr(ptr2, ',');
   if(!ptr)
      cs_critical_error(ERR_REQUEST_FORMAT_ERROR, "super_process_request");
   *ptr = '\0';
   snprintf(p_node->data.username, MAX_USERNAME +1, "%s", ptr2);
   ptr++;
    
   snprintf(p_node->data.realname, MAX_NAME, "%s", ptr);

  
   return p_node;
}

int has_testpilot_account(char *username)
{
   char path[MAX_PATH +1];
   snprintf(path, MAX_PATH +1, "../%s/%c/%s/%s", USERS_DIR, sub_dir_name(username), username, TESTPILOT_FNAME);
   if(file_exists(path))
	   return 1;
   return 0;
}


P_NODE * build_request_list()
{
   char path[MAX_PATH +1];
   char line[MAX_PATH +1];
   FILE *fp;
   P_NODE *ptr, *head =0, *current=0;

   snprintf(path, MAX_PATH +1, "../etc/%s", REQUEST_TESTPILOT_FNAME);
   if(!file_exists(path))
      cs_critical_error(ERR_TESTPILOT_REQUEST_LIST, "super_process_request"); 
	 
   fp = fopen(path, "r");
   if(!fp)
      cs_critical_error(ERR_FREAD_FAILED, path);
    
   while(fgets(line, MAX_PATH, fp))
   {
	strtrm(line);
        ptr = get_new_node(line);
        if(!head)
	   head =  ptr;
        else
	   current->next = ptr;
        current = ptr;	
   }
   fclose(fp);
   return head;
}

void send_list()
{
     P_NODE *ptr;
     P_NODE *head = build_request_list();
     int count =0; 
     char name[MAX_PATH +1];

    for(ptr = head; ptr; ptr = ptr->next)
    {
        if(!has_testpilot_account(ptr->data.username))
	{
	       snprintf(name, MAX_PATH +1, "user.%d.id", count);
	       cs_set_value(name, ptr->data.id);
	       snprintf(name, MAX_PATH +1, "user.%d.realname", count);
	       cs_set_value(name, ptr->data.realname);
	       snprintf(name, MAX_PATH +1, "user.%d.password", count);
	       cs_set_value(name, ptr->data.password);
	       count++;	
	}
    }
    free_option_person_list(head);
}

void save_admin_pass(SESSION *user, char *key)
{
    char path[MAX_PATH +1];
    FILE *fp;
    char *do_insert;

    do_insert = hdf_get_value(global_cgi->hdf, "Query.do_insert", "");
    if(strlen(do_insert))
    { 
    snprintf(path, MAX_PATH +1, "../%s/%s/%s", USERS_DIR, ADMIN_DIR, TESTPILOT_FNAME);
    if(!file_exists(path))
    {
	 fp = fopen(path, "w");
	 if(!fp)
	    cs_critical_error(ERR_FWRITE_FAILED, path);
	 fprintf(fp, "%s/%s",  user->username, key);
	 fclose(fp);

    }
    }
}




void save_password(SESSION *user, char *key)
{
     P_NODE *ptr;
     P_NODE *head = build_request_list();
     char path[MAX_PATH +1];
     FILE *fp;

    for(ptr = head; ptr; ptr = ptr->next)
    {
        if(!has_testpilot_account(ptr->data.username))
	{
           snprintf(path, MAX_PATH +1, "../%s/%c/%s/%s", USERS_DIR, sub_dir_name(ptr->data.username), ptr->data.username, TESTPILOT_FNAME);
           fp = fopen(path, "w");
           if(!fp)
	      cs_critical_error(ERR_FWRITE_FAILED, path);
	   fprintf(fp, "%s",  ptr->data.password);
	   fclose(fp);
           	   
	}
    }
    free_option_person_list(head);
    save_admin_pass(user, key);

}


void  send_whole_list ()
{
     P_NODE *ptr;
     P_NODE *head = build_request_list();
     int count =0; 
     char name[MAX_PATH +1];
     char index[MAX_PATH +1];

    for(ptr = head; ptr; ptr = ptr->next)
    {
	       snprintf(name, MAX_PATH +1, "user.%d.id", count);
	       cs_set_value(name, ptr->data.id);
	       snprintf(name, MAX_PATH +1, "user.%d.realname", count);
	       cs_set_value(name, ptr->data.realname);
	       snprintf(name, MAX_PATH +1, "user.%d.password", count);
	       cs_set_value(name, ptr->data.password);
	       snprintf(name, MAX_PATH +1, "user.%d.index", count);
	       snprintf(index, MAX_PATH +1, "tests/%s/index.tpx", ptr->data.id);
	       cs_set_value(name, index);
	       count++;	
    }

    free_option_person_list(head);
}

void check_admin_has_account(char *key, SESSION *user)
{
   char path[MAX_PATH +1];
   char username[MAX_USERNAME +1];
   char pass[MAX_PASSWORD +1];

   snprintf(path, MAX_PATH +1, "../%s/%s/%s", USERS_DIR, ADMIN_DIR, TESTPILOT_FNAME);

   if(!file_exists(path))
   {
       cs_set_value("admin_name", user->username);
       cs_set_value("admin_pass", key);
       cs_set_int_value("do_insert", 1);
   } 
   else
   {
      get_testpilot_admin_pass(path, username, pass); /* shared_testpilot_util.c */

   }
  cs_set_server_name();
  cs_set_value("SBIN", system_data_str("SBIN_ALIAS")); 
}

void redirect_to_testpilot(char *key, SESSION *user)
{
   char path[MAX_PATH +1];
   char username[MAX_USERNAME +1];
   char pass[MAX_PASSWORD +1];

   snprintf(path, MAX_PATH +1, "../%s/%s/%s", USERS_DIR, ADMIN_DIR, TESTPILOT_FNAME);
   get_testpilot_admin_pass(path, username, pass); /* shared_testpilot_util.c */
   if(strlen(username) == 0 || strlen(pass) ==0)
	cs_critical_error(ERR_ADMIN_TESTPILOT_ACCOUNT, "You must first process requested TestPilot accounts");
   
   printf("Location: %s?id=%s&u_name=%s&pass=%s&action=view_account\n\n", system_data_str("TESTPILOT_ADMIN_SCRIPT_PATH"), key, username, pass);
}




int
main ()
{
  char key[MAX_KEY + 1];	/* from id=? command line */
  SESSION user;
  char *process = 0;

  cs_cgi_init();
  read_param ( key);
  validate_super_key (key, &user);	/* shared_super_util.c*/
 
  process = hdf_get_value(global_cgi->hdf, "Query.process", "");
  if(strlen(process) == 0) 
  {
    send_list ();
    check_admin_has_account(key, &user);
  }
  else if(strcmp(process, "1") ==0)
    save_password(&user, key);
  else if(strcmp(process, "view_account") ==0)
    redirect_to_testpilot(key, &user);
  else
    send_whole_list ();
  cs_set_value("testpilot_admin_script_path", system_data_str("TESTPILOT_ADMIN_SCRIPT_PATH"));
  cs_cgi_display("super_process_request", 1);
  cs_cgi_destroy();
  return 0;			/* exit successfully */

}

