create or replace package p_ese5 as

web constant VARCHAR2(125) := 'http://oracle1.cli.di.unipi.it/pls/webdb/';
oracleuser constant VARCHAR2(25) := 'XXX.'; /* LASCIARE IL PUNTO NELLA VARIABILE*/

TYPE tabellaScelte IS TABLE OF varchar2(15) INDEX BY BINARY_INTEGER;
tabellaScelteVuota tabellaScelte;

TYPE HTTPCognomiT IS TABLE OF VARCHAR2(15) INDEX BY BINARY_INTEGER;
EmptyHTTPCognomi HTTPCognomiT;

procedure mostra(
	ICognomi  in HTTPCognomiT DEFAULT EmptyHTTPCognomi);

procedure logon(
    nomeUtente             in sessioni.nomeUtente%TYPE,
    annoNascita            in sessioni.annoNascita%TYPE
);

procedure negozio(
    sessioneCorrente  in sessioni.idSessione%TYPE
);

procedure conferma(
    sessioneCorrente  in sessioni.idSessione%TYPE
);

procedure scheduler(
    scelta           in varchar2,
    sessioneCorrente in sessioni.idSessione%TYPE
);

procedure aggiornaScelte(
    sessioneCorrente     in sessioni.idSessione%TYPE,
    scelteCorrenti       in tabellaScelte DEFAULT tabellaScelteVuota
);

/*
procedure garbage(
    minuti in number
);
*/

end p_ese5;
/


create or replace package body p_ese5 as

/* %%%%%%%%%%%%%%%%%%%%%%%%%%
   AGGIORNASCELTE aggiorna lo stato alle ultime scelte effettuate:
    a) elimina le vecchie scelte d'acquisto
    b) inserisce le nuove selte d'acquisto fatte dall'utente
   %%%%%%%%%%%%%%%%%%%%%%%%%%
*/

procedure mostra(
	ICognomi  in HTTPCognomiT DEFAULT EmptyHTTPCognomi) is
begin
  htp.print('<html><body>ciao</body></html>');
end mostra;


procedure aggiornaScelte(
    sessioneCorrente     in sessioni.idSessione%TYPE,
    scelteCorrenti       in tabellaScelte DEFAULT tabellaScelteVuota
)
is
i binary_integer;
begin

delete from scelte
where sessione = sessioneCorrente;

i := scelteCorrenti.first;

while (i is not null)
loop

 insert into scelte
 values (sessioneCorrente, scelteCorrenti(i));
 
 i:=scelteCorrenti.next(i);

end loop;

conferma(sessioneCorrente);

end aggiornaScelte;

/* %%%%%%%%%%%%%%%%%%%%%%%%%%
   LOGON accesso al negozio virtuale: crea una nuova sessione nel 
   database per l'utente e accede al negozio
   %%%%%%%%%%%%%%%%%%%%%%%%%%
*/

procedure logon(
    nomeUtente             in sessioni.nomeUtente%TYPE,
    annoNascita            in sessioni.annoNascita%TYPE
)
is
code sessioni.idSessione%TYPE;
begin

  insert into sessioni
  values (idSessioneSeq.nextval,nomeUtente,annoNascita,sysdate());

  select idSessioneSeq.currval into code
  from dual;

  negozio(code);
end logon;

/* %%%%%%%%%%%%%%%%%%%%%%%%%%
   NEGOZIO consente di acquistare oggetti mediante selezione con check box;
   se l'utente ha gia' delle scelte attive nella sessione corrente, le 
   corrispondenti checkbox vengono selezionate
   %%%%%%%%%%%%%%%%%%%%%%%%%%
*/
procedure negozio(
    sessioneCorrente  in sessioni.idSessione%TYPE
)
is
quanti  number;
nomeUtenteCorrente sessioni.nomeUtente%TYPE;
spesaTotale number;
numOggetti number;
begin

  htp.htmlOpen;
  htp.headOpen;
  htp.title('Negozio Elettronico');
  htp.headClose;
  htp.print('<BODY TEXT="#FFFFFF" BGCOLOR="#009900">');

  htp.print('<H1> Negozio virtuale </H1>');

  update sessioni
  set timeStamp = sysdate()
  where idSessione=sessioneCorrente;  

  spesaTotale :=0; 

  select sum(prezzo), count(*) into spesaTotale, numOggetti
  from acquisti, oggetti
  where (sessioneCorrente = acquisti.sessione) and
        (idOggetto = acquisti.oggetto);
  
  select nomeUtente into nomeUtenteCorrente
  from sessioni
  where idSessione = sessioneCorrente;  

  htp.print('Caro '||nomeUtenteCorrente||' al momento hai nel carrello '||numOggetti||' articoli, per un totale di '||spesaTotale||' Euro.<P><P>');
  htp.print('Seleziona gli articoli che intendi comperare:<P>');
  
  htp.formOpen(web || oracleuser || 'p_ese5.aggiornaScelte','GET');

  htp.print('<INPUT TYPE="HIDDEN" NAME="sessioneCorrente" VALUE="'||sessioneCorrente||'">');

  htp.tableOpen;
  htp.print('<TR>');
    htp.print('<TD> </TD>');
    htp.print('<TD> <B> Descrizione </B> </TD>');
    htp.print('<TD> <B> Prezzo      </B> </TD>');
  htp.print('</TR>');
  
  for ogg in (select * from oggetti)
  loop 
   htp.print('<TR>');

     select count(*) into quanti 
     from scelte
     where (sessione = sessioneCorrente) and
           (oggetto = ogg.idOggetto);

     htp.print('<TD>');
     if (quanti = 0) 
        then htp.print('<INPUT TYPE=CHECKBOX NAME="scelteCorrenti" VALUE="'||ogg.idOggetto||'">');
        else htp.print('<INPUT TYPE=CHECKBOX NAME="scelteCorrenti" VALUE="'||ogg.idOggetto||'" CHECKED>');
     end if;
     htp.print('</TD>');

     htp.print('<TD>'||ogg.descrizione||'</TD>');
     htp.print('<TD>'||ogg.prezzo||'</TD>');
   htp.print('</TR>');
  end loop;
    
  htp.tableClose;

  htp.print('<INPUT TYPE=SUBMIT VALUE="Seleziona" >');

  htp.formClose;  

  htp.formOpen( web || oracleuser || 'p_ese5.logoff','GET');
  htp.print('<INPUT TYPE=SUBMIT VALUE="Esci e paga">');  
  htp.formClose;

  htp.formOpen( web || oracleuser || 'vedisessioni','GET');
  htp.print('<INPUT TYPE="HIDDEN" NAME="sessioneCorrente" VALUE="'||sessioneCorrente||'">');
  htp.print('<INPUT TYPE=SUBMIT VALUE="Guarda sessioni">');  
  htp.formClose;

  htp.bodyClose;
  htp.htmlClose;

end negozio;

/* %%%%%%%%%%%%%%%%%%%%%%%%%%
   CONFERMA mostra all'utente il subtotale relativo alle scelte d'acquisto 
   correnti e chiede la conferma dell'acquisto
   %%%%%%%%%%%%%%%%%%%%%%%%%%
*/

procedure conferma(
    sessioneCorrente  in sessioni.idSessione%TYPE
)
is
nomeUtenteCorrente sessioni.nomeUtente%TYPE;
spesaTotale number;
begin
  htp.htmlOpen;
  htp.headOpen;
  htp.title('Stato della transazione');
  htp.headClose;
  htp.print('<BODY TEXT="#FFFFFF" BGCOLOR="#009900">');

  update sessioni
  set timeStamp = sysdate()
  where idSessione=sessioneCorrente;  

  select nomeUtente into nomeUtenteCorrente
  from sessioni
  where idSessione = sessioneCorrente;
 
  select sum(prezzo) into spesaTotale
  from oggetti, scelte
  where (sessioneCorrente = scelte.sessione) and
        (idOggetto = scelte.oggetto);
 
  htp.print('<H1> Conferma </H1>');
  htp.print('Caro '||nomeUtenteCorrente||', confermi l''acquisto dei seguenti articoli per un totale di '||spesaTotale||'?');

  htp.tableOpen;
  htp.print('<TR>');
    htp.print('<TD><B> Descrizione </B></TD>');
    htp.print('<TD><B> Prezzo      </B></TD>');
  htp.print('</TR>');
  
  for ogg in (select * from oggetti, scelte
              where (sessioneCorrente = scelte.sessione) and
                    (idOggetto = scelte.oggetto))
  loop
   htp.print('<TR>');
    htp.print('<TD>'||ogg.descrizione||'</TD>');
    htp.print('<TD>'||ogg.prezzo||'</TD>');
   htp.print('</TR>');
  end loop;
    
  htp.tableClose;

  htp.formOpen(web || oracleuser ||'p_ese5.scheduler','GET');
  htp.br;
  htp.print('<INPUT TYPE="HIDDEN" NAME="sessioneCorrente" VALUE="'||sessioneCorrente||'">');
  htp.print('<INPUT TYPE=SUBMIT NAME="scelta" VALUE="SI">');
  htp.print('<INPUT TYPE=SUBMIT NAME="scelta" VALUE="NO">');

  htp.formClose;
  
  htp.bodyClose;
  htp.htmlClose;

end conferma;

/* %%%%%%%%%%%%%%%%%%%%%%%%%%
   SCHEDULER gestisce la conferma d'acquisto delle scelte attive di 
   un'utente; la procedura ritorna al negozio virtuale,
   premurandosi di eliminare le scelte e di inserire i corrispondenti 
   acquisti nel database nel caso l'utente voglia comprare.
   %%%%%%%%%%%%%%%%%%%%%%%%%%
*/
procedure scheduler(
    scelta           in varchar2,
    sessioneCorrente in sessioni.idSessione%TYPE
)
is
begin

if scelta='SI' 
  then begin
        for sce in (select * from scelte
                    where sessione = sessioneCorrente)
        loop 
         insert into acquisti
         values (sce.sessione, sce.oggetto);
        end loop;     

        delete from scelte
        where sessione = sessioneCorrente;
       end;
end if;

negozio(sessioneCorrente);

end scheduler;


/* %%%%%%%%%%%%%%%%%%%%%%%%%%
   GARBAGE si occupa di eliminare tutte le informazioni relative
   alle sessioni non attive da piu' di MIN minuti
   %%%%%%%%%%%%%%%%%%%%%%%%%%


procedure garbage(
  minuti  in number
)
is
begin
...
end garbage;

*/

end p_ese5;
/

show err;