package com.corejsf;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

import javax.faces.bean.ManagedBean; 
   // lub import javax.inject.Named;
import javax.faces.bean.SessionScoped; 
   // lub import javax.enterprise.context.SessionScoped;

@ManagedBean // lub @Named
@SessionScoped
public class QuizBean implements Serializable {
   private int currentProblem;
   private int tries;
   private int score;
   private String response = "";
   private String correctAnswer;

   // Poniżej zakodowano problemy na stałe. W rzeczywistej aplikacji
   // najprawdopodobniej odczytywalibyśmy je z bazy danych.
   private ArrayList<Problem> problems = new ArrayList<Problem>(Arrays.asList(
      new Problem(
         "Jaki slogan reklamował programowanie w Javie? Write once, ...",
         "run anywhere"),
      new Problem(
         "Jak wyglądają 4 pierwsze bajty każdego pliku klasy (szesnastkowo)?",
         "CAFEBABE"),
      new Problem(
         "Co zostanie wyświetlone przez to wyrażenie? System.out.println(1+\"2\");",
         "12"),
      new Problem(
         "Które słowo kluczowe Javy służy do definiowania podklasy?",
         "extends"),
      new Problem(
         "Jak brzmiała oryginalna nazwa języka programowania Java?",
         "Oak"),
      new Problem(
         "Która klasa pakietu java.util opisuje punkt w czasie?",
         "Date")));

   public String getQuestion() { return problems.get(currentProblem).getQuestion(); }

   public String getAnswer() { return correctAnswer; }

   public int getScore() { return score; }

   public String getResponse() { return response; }
   public void setResponse(String newValue) { response = newValue; }

   public String answerAction() {
      tries++;
      if (problems.get(currentProblem).isCorrect(response)) {
         score++;
         nextProblem();
         if (currentProblem == problems.size()) return "done";
         else return "success";
      }
      else if (tries == 1) return "again";
      else {
         nextProblem();
         if (currentProblem == problems.size()) return "done";
         else return "failure";
      }
   }

   public String startOverAction() {
      Collections.shuffle(problems);
      currentProblem = 0;
      score = 0;
      tries = 0;
      response = "";
      return "startOver";
   }

   private void nextProblem() {
      correctAnswer = problems.get(currentProblem).getAnswer();
      currentProblem++;
      tries = 0;
      response = "";
   }
}
