########################################### 
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;
