###########################################
package QuizShow::Controller::Quiz;
# Mike Schilli, 2008 (m@perlmeister.com)
###########################################
use strict;
use warnings;
use base 'Catalyst::Controller';

###########################################
sub quiz : Global {
###########################################
  my ( $self, $c, @args ) = @_;

  if((@args and $args[0] eq "reset") or
   !defined $c->session->{next_question} or
   $c->session->{"next_question"} == -1
    ) {
    $c->session->{"next_question"} = 0;
    $c->session->{"score_ok"}      = 0;
    $c->session->{"score_nok"}     = 0;
    $c->session->{"total"}         = 
           $c->model('Questions')->total();
    $c->response->redirect($c->uri_for());
    $c->detach();
  }

  if(my $answer = 
          $c->req->param("answer")) {

    if($answer == 
       $c->session()->{"correct_answer"}) {

        $c->session()->{"score_ok"}++;
    } else {

        $c->session()->{"score_nok"}++;
    }
  }

  my $next_question = 
    $c->session()->{"next_question"} || 0;

  $c->stash->{template} = 'quiz.tt';

  my ($question, @answers) =
    $c->model('Questions')->
            get_question( $next_question );

  if(defined $question) {
    @answers = map { [$_, 'incorrect'] } 
                                @answers;
    $answers[0]->[1] = 'correct';

    my $correct_answer;
    my $i = 0;

    while (@answers) {
      my $pick = splice(@answers, 
                        rand @answers, 1);
      push @{ $c->stash->{answers} }, 
           { text => $pick->[0], 
             num => ++$i};

      $c->session()->{"correct_answer"}= $i 
          if $pick->[1] eq 'correct';
    }
    $c->session()->{"next_question"} = 
                        $next_question + 1;
  } else {
      $c->session->{next_question} = -1;
  }

  $c->stash->{question} = $question;

  for(qw( total score_ok score_nok 
          next_question)) {
    $c->stash->{ $_ } = 
        $c->session()->{ $_ };
  }
}

1;
