/* Author: Ram Samudrala (me@ram.org)
 * Version: O1.0
 * Detail: <http://www.ram.org/computing/sc/sc.html>
 * November 22, 1996; Copyright (c) 1995 by Ram Samudrala.
 *
 * See the URL above for terms of use and general help.
 */

#include "cgi_common.h"
#include "cgi_defines.h"
#include "sc_defines.h"
#include "cgi_cookies.h"
#include "cgi_display.h"
#include "cgi_error_handlers.h"
#include "display_item_list.h"
#include "items.h"
#include "search.h"

int content_type_displayed = FALSE;

void add_to_order(char *args[]);
void add_to_order_string(char order_string[], char *args[]);
void display_order(item items[], int checkout);
void clear_order(char url[]);

void display_order_header(int checkout);
void display_order_item(char name[], int quantity, char desc[], double price, int checkout);
void display_order_trailer(int checkout);
void display_all_items(item items[]);

/******************************************************************/

int main(int argc, char *argv[])
{
  if (strcmp(getenv("REQUEST_METHOD"), "POST") == 0) /* search */
    search();
  else
    {
      item items[MAX_ITEMS];
     
      switch(argc)
	{
	case 1:
	  read_items(DEFAULT_ITEMS_FILE, items);
	  display_order(items, FALSE);
	  break;
	case 2:
	  if (strcmp(argv[1], "list") == 0)
	    {
	      read_items(DEFAULT_ITEMS_FILE, items);
	      display_order(items, FALSE);
	    }
	  else
	    if (strcmp(argv[1], "checkout") == 0)
	      {
		read_items(DEFAULT_ITEMS_FILE, items);
		display_order(items, TRUE);
	      }
	  else
	    if (strcmp(argv[1], "catalog") == 0)
	      {
		read_items(DEFAULT_ITEMS_FILE, items);
		display_all_items(items);
	      }
	    else
	      display_error("main(): unrecognised argument!");
	  break;
	case 3:
	  if (strcmp(argv[1], "clear") == 0)
	    clear_order(argv[2]);
	  else
	    display_error("main(): unrecognised argument!");
	  break;
	case 4:
	  add_to_order(argv);
	  break;
	default:
	  display_error("main(): unrecognised argument!");
	}
    }
  return 1;
}

/******************************************************************/

void clear_order(char url[])
{
  clear_cookie(ORDER_COOKIE_NAME, DEFAULT_PATH, url);
  return;
}

/******************************************************************/

void display_order(item items[], int checkout)
{
  char cookie_string[ORDER_COOKIE_STRING_LENGTH];
  char order_string[ORDER_COOKIE_STRING_LENGTH], *cp, *cptok;
  char desc[ITEM_DESCRIPTION_STRING_LENGTH];
  char name[ITEM_DESCRIPTION_STRING_LENGTH], *cp_delim;
  int quantity;
  double price, shipping_price;
  
  if (getenv("HTTP_COOKIE") != NULL)
    {
      sprintf(cookie_string, "%s", getenv("HTTP_COOKIE"));
      cp = strstr(cookie_string, "order=");
      if (cp != NULL)
	{
	  display_order_header(checkout);
	  sscanf(cp, "order=%s", order_string);	  
	  if ((cptok = strtok(order_string, "|")) != NULL)
	    {
	      if ((cp_delim = strchr(cptok, (int) SEPARATOR)) == NULL)
		display_error("display_order(): separator not found!"); 
	      *cp_delim = '\0';
	      strcpy(name, cptok);
	      cp_delim++;
	      quantity = atoi(cp_delim);
	      get_item_desc_price(name, quantity, &price, &shipping_price, desc, items);
	      display_order_item(name, quantity, desc, price, checkout);
	    }
	  while ((cptok = strtok(NULL, "|")) != NULL)
	    {
	      if ((cp_delim = strchr(cptok, (int) SEPARATOR)) == NULL)
		display_error("display_order(): separator not found!"); 
	      *cp_delim = '\0';
	      strcpy(name, cptok);
	      cp_delim++;
	      quantity = atoi(cp_delim);
	      get_item_desc_price(name, quantity, &price, &shipping_price, desc, items);
	      display_order_item(name, quantity, desc, price, checkout);
	    }
	  display_order_trailer(checkout);
	}
      else
	display_error("display_order(): order cookie not found!"); 
    }
  else
    display_error("display_order(): no cookie exists (no items selected)!"); 
  return;
}

/******************************************************************/

void add_to_order(char *args[])
{
  char cookie_string[ORDER_COOKIE_STRING_LENGTH], order_string[ORDER_COOKIE_STRING_LENGTH], *cp;

  if (getenv("HTTP_COOKIE") != NULL)
    {
      sprintf(cookie_string, "%s", getenv("HTTP_COOKIE"));
      cp = strstr(cookie_string, "order=");
      if (cp != NULL)
	{
	  sscanf(cp, "order=%s", order_string);
	  add_to_order_string(order_string, args);
	  set_cookie(ORDER_COOKIE_NAME, order_string, DEFAULT_PATH, DEFAULT_EXPIRES, args[3]); 
	  return;
	}
    }

  /* Order cookie doesn't exist.  Could be a problem, but create a new order anyway. */
  strcpy(order_string, "|"); 
  add_to_order_string(order_string, args);
  set_cookie(ORDER_COOKIE_NAME, order_string, DEFAULT_PATH, DEFAULT_EXPIRES, args[3]); 
  return;
}

/******************************************************************/

void add_to_order_string(char order_string[], char *args[])
{
  char tmp_string[ORDER_COOKIE_STRING_LENGTH];
  
  sprintf(tmp_string, "%s%c%s|", args[1], SEPARATOR, args[2]);
  strcat(order_string, tmp_string);
  return;
}

/******************************************************************/

void display_order_header(int checkout)
{
  if (checkout)
    {
      display_content_type("Checking out...");
      printf("<h1> Checking out... </h1>\n");
      printf("<p> Here is a list of items you have in your shopping cart.\n");
      printf("Leaving the quantity field blank will remove that item from the cart.\n");
      printf("Once you've filled in the requested information, you can test your order\n");
      printf("to make sure the items listed are what you want and all the other information\n");
      printf("is entered correctly.  If everything looks okay, you can submit the order.\n");
      printf("You will receive conformation of your order within 48 hours.  If you have any\n");
      printf("problems, please report them to <var><a href=\"mailto:%s\">%s</a></var>.</p>\n", CARETAKER, CARETAKER);
      printf("<hr>\n");

      printf("<form method=\"post\" action=\"%s%s\">\n", DEFAULT_URL, ORDER_PROCESSING_SCRIPT);
      printf("<p> Name: <input name=\"Name\" size=\"20\">\n");
      printf("E-mail: <input name=\"E-mail\" size=\"20\"> </p>\n");
      printf("<p> Street: <input name=\"Street\" size=\"49\"> </p>\n");
      printf("<p> City: <input name=\"City\" size=\"28\">\n");
      printf("State: <input name=\"State\" size=\"5\">\n");
      printf("Zip: <input name=\"Zip\" size=\"5\"></p>\n");
      printf("<p> <input type=\"checkbox\" name=\"X_country\" value=\"outside_US\"> Check if\n");
      printf("shipping address is outside the U.S. </p>\n");
      printf("<p> Specify or change quantity in box for the items you wish to order: </p>\n");
      printf("<input type=\"hidden\" name=\"X_table\" value=\"start_table\">\n");
    }
  else
    {
      display_content_type("List of items in shopping cart");
      printf("<h1> List of items in shopping cart </h1>\n");
      printf("<p> You will be given an option to change the quantity of, or remove,\n");
      printf("items you ordered when you <a href=\"%s?checkout\">check out</a>. </p>\n",
	     SHOPPER_PROCESSING_SCRIPT);
      printf("<hr>\n");
    }
  printf("<table border>\n");
  if (!checkout)
    printf("<tr> <th> Item </th> <th> Quantity </th> <th> Price </th> </tr>\n");
  else
      printf("<tr> <th> </th> <th> Item </th> <th> Price </th> </tr>\n");

  return;
}

/******************************************************************/

void display_order_item(char name[], int quantity, char desc[], double price, int checkout)
{
  if (!checkout)
    printf("<tr align=center> <td> %s </td> <td> %5d </td> <td> $%5.2f </td> </tr>\n", desc, quantity,  price);
  else
    printf("<tr align=center> <td> <input name=\"%s\" size=\"%s\", value=\"%d\"> </td> <td> %s </td> <td> $%5.2f </td> </tr>\n", 
	   name, DEFAULT_INPUT_FIELD_SIZE, quantity, desc, price);
  return;
}

/******************************************************************/

void display_order_trailer(int checkout)
{
  printf("</table>\n");
  if (checkout)
    {
      printf("<input type=\"hidden\" name=\"X_table\" value=\"end_table\">\n");
      printf("<p> <input type=\"radio\" name=\"X_action\" value=\"test\" checked>\n");
      printf("<b>TEST order</b> or <input type=\"radio\" name=\"X_action\" value=\"submit\">\n");
      printf("<b>SUBMIT order.</b> </p>\n");
      printf("<p> <input type=submit value=\"submit\"> <input type=reset value=\"clear\"> </p>\n");
      printf("</form>\n");
    }
  display_signature(SIGNATURE_FILE);
  return;
}

/******************************************************************/

void display_all_items(item items[])
{
  display_order_header(TRUE);
  display_item_list(items);
  display_order_trailer(TRUE);
  return;
}

/******************************************************************/
