/*  $Id$

    Part of SWI-Prolog

    Author:        Jan Wielemaker
    E-mail:        wielemak@science.uva.nl
    WWW:           http://www.swi-prolog.org
    Copyright (C): Public domain
*/

:- use_module(library('http/thread_httpd')).
:- use_module(library('http/html_write')).
:- use_module(library('http/http_session')).
:- use_module(library('http/http_error')).

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
This demo shows session state  management   in  a very simple calculator
package. It also demonstrates the use of  the html_write library. To use
it, start Prolog, load this file and run

        ?- server.

Now direct your browser to http://localhost:3000/
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

server :-
    server(3000, []).

server(Port, Options) :-
    http_server(reply,
                [ port(Port),
                  timeout(20)
                | Options
                ]).

reply(Request) :-
    memberchk(path(Path), Request),
    reply(Path, Request).

reply(/, _Request) :-
    http_session_retractall(formula(_)),
    Formula = 0,
    http_session_assert(formula(Formula)),
    page(Formula).

reply('/calc', Request) :-
    memberchk(search(Search), Request),
    memberchk(operation=Op, Search),
    memberchk(value=AtomVal, Search),
    atom_number(AtomVal, Val),
    http_session_retract(formula(Formula0)),
    debug(calc, 'Formula0 = ~w', [Formula0]),
    Formula =.. [Op, Formula0, Val],
    http_session_assert(formula(Formula)),
    page(Formula).


page(Formula) :-
    reply_page('HTTP Session DEMO',
               [ h2('Simple session demo'),
                 form([ action('/calc'),
                        method('GET')
                      ],
                      table([align(center), border(1)],
                            [ tr(td(\formula(Formula))),
                              tr(td([ \ops,
                                      input([ name(value) ]),
                                      input([ type(submit),
                                              value('Calc!')
                                            ])
                                    ]))
                            ]))
               ]).

formula(Formula) -->
    { sformat(S, '~w', [Formula]),
      Value is Formula
    },
    html([ S, ' = ', Value ]).

ops -->
    html(select(name(operation),
                [ option([selected], +),
                  option([], -),
                  option([], /),
                  option([], *)
                ])).

reply_page(Title, Content) :-
    phrase(page(title(Title), Content), HTML),
    format('Content-type: text/html~n~n'),
    print_html(HTML).
