#!/usr/bin/perl

use lib '../lib';
use strict;
use warnings;
use Continuity;
use Continuity::Inspector;

my $server = new Continuity(
      port => 8080,
      ip_session => 0,
      cookie_session => 'sid',
      path_session => 1,
);
$server->loop;

sub getNum {
  my $request = shift;
  $request->print( qq{
    Enter Guess: <input name="num" id=num>
    <script>document.getElementById('num').focus()</script>
    </form>
    </body>
    </html>
  });
  $request = $request->next;
  my $num = $request->param('num');
  return $num;
}

sub main {
  my $request = shift;

  my $path = $request->request->url->path;
  print STDERR "Path: '$path'\n";

  # If this is a request for the pushtream, then give them that
  if($path =~ /^\/peek/) {
    peek($request);
  }

  while(1) {
    my $guess;
    my $number = int(rand(100)) + 1;
    my $tries = 0;
    my $out = qq{
      <html>
        <head><title>The Guessing Game</title></head>
        <body>
          <form method=POST>
            Hi! I'm thinking of a number from 1 to 100... can you guess it?<br>
    };
    do {
      $tries++;
      do {
        $request->print($out);
        $guess = getNum($request);
      } until ($guess > 0);
      $out .= "It is smaller than $guess.<br>\n" if $guess > $number;
      $out .= "It is bigger than $guess.<br>\n" if $guess < $number;
    } until ($guess == $number);
    $request->print("You got it! My number was in fact $number.<br>\n");
    $request->print("It took you $tries tries.<br>\n");
    $request->print('<a href="/">Try Again</a>');
    $request->next;
}}

sub peek {
  my ($request) = @_;
  while(1) {
    my $sessions = $server->{mapper}->{sessions};
    $request->print(sprintf "Session count: %d<br>\n", scalar keys %$sessions);
    my $sess;
    my $inspector = Inspector->new( callback => sub {
      use PadWalker 'peek_my';
      for my $i (1..100) { 
print STDERR "bjork\n";
        my $vars = peek_my($i) or last;
        next unless exists $vars->{'$number'};
        $request->print("$sess: secret number: ", ${ $vars->{'$number'} }, "<br>\n");
        last;
      }
    });
    foreach $sess (keys %$sessions) {
      # next unless $sess =~ /^\.\./;
      next if $sess =~ /peek/;  # don't try to peek on ourself.  that would be bad.
      $inspector->inspect( $sessions->{$sess} );
    }
    $request->next;
  }
}