#!/usr/bin/perl -wT
use CGI qw(:standard);
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
use lib '.';
use Shopcart;
use strict;

my $item = $ENV{QUERY_STRING};

# 1. First be sure the item they're ordering is actually valid. No 
#    point in setting cookies for bogus items.

unless ($item =~ /^\d+$/) {  # make sure the item number is alphanumeric.
   &dienice("Item `$item' is not a valid item number.");
}

my $sth = $dbh->prepare("select * from items where stocknum=?") or &dbdie;
$sth->execute($item) or &dbdie;
if (my $rec = $sth->fetchrow_hashref) {
   if ($rec->{status} eq "OUT") { # out of stock. They can't order it.
      &dienice("We're sorry, but $rec->{name} (item #$item) is out of stock.");
   }
} else {
   &dienice("There is no item numbered `$item' in the database.");
}

# 2. See if a cookie has already been set (and is valid). 

my $cookie_id = "";

if (cookie('cart')) { # found a cookie! see if it's valid...
   $sth = $dbh->prepare("select * from cart_cookies where cookie_id=?") or &dbdie;
   $sth->execute(cookie('cart')) or &dbdie;
   if (my $rec = $sth->fetchrow_hashref) {
      $cookie_id = cookie('cart');
   }
}

# 2a. If no cookie was found, set one.

if ($cookie_id) {       # A valid cookie was found. Print a regular header. 
   print header();
} else {                # no valid cookie found, so set one.
   $cookie_id = &random_id();
   my $cookie = cookie(-name=>'cart', -value=>$cookie_id, 
      -expires=>'+7d');
   $sth = $dbh->prepare("insert into cart_cookies values(?,current_timestamp())") or &dbdie;
   $sth->execute($cookie_id) or &dbdie;
   print header(-cookie=>$cookie);
}

# 3. Add the ordered item to the shopping cart table.
#    If they already ordered one of these items, increment the QTY
#    Otherwise, insert a new record with QTY=1.

$sth = $dbh->prepare("select * from shopcart where cookie=? and item_number=?") or &dbdie;
$sth->execute($cookie_id, $item) or &dbdie;
if ($sth->fetchrow_hashref) {
   $sth = $dbh->prepare("update shopcart set qty=qty+1 where cookie=? and item_number=?") or &dbdie;
   $sth->execute($cookie_id, $item) or &dbdie;
} else {
   $sth = $dbh->prepare("insert into shopcart values(?,?,?)") or &dbdie;
   $sth->execute($cookie_id, $item, 1) or &dbdie;
}

# 4. Display the shopping cart

print start_html("Add Item");

&display_shopcart($cookie_id);

print end_html;

sub random_id {
    # This routine generates a 32-character random string
    # out of letters and numbers.
    my $rid = "";
    my $alphas = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    my @alphary = split(//, $alphas);
    foreach my $i (1..32) {
       my $letter = $alphary[int(rand(@alphary))];
       $rid .= $letter;
    }
    return $rid;
}