require(['util']);

function defineWordQuiz(term, choose) {
  var key = term.key;
  return {
    term: term,
    key: key,
    question: function (container) {
      var options = [term];
      var correct;
      (function () {
        var used = [];
        for (var i = 4; --i >= 1;) {
          while (true) {
            var chosen = choose();
            // Prevent duplicate choices on a multiple choices.
            if (chosen.term !== term && !used[chosen.index]
                // Some Spanish words are both adjectives and nouns
                // which require different terms.
                && chosen.term.esp !== term.esp) {
              options[i] = chosen.term;
              used[chosen.index] = true;
              break;
            }
          }
        }
        shuffle(options);
        for (var i = options.length; --i >= 0;) {
          if (options[i] === term) { correct = i; break; }
        }
      })();
      assert(options[correct] === term);
      container.innerHTML = 'Which means "' + html(term.eng) + '"?'
          + '<form onsubmit="var form=this;setTimeout(function () {'
          + 'fc.checkAnswer(' + js(key) + ',form,' + correct
          + ',form.parentNode)'
          + '}, 0);return false;">'
          + map(range(0, options.length),
                function (idx) {
                  return '<span><input type=radio name=answer'
                      + ' value=' + idx + ' id="answer-' + idx + '">'
                      + '<label for="answer-' + idx + '">'
                      + html(options[idx].esp) + '</label></span>'; })
              .join('')
          + '<br><input type=submit value="Elige">'
          + '</select></form>';
    }
  };
}

function conjugateQuiz(term, tense) {
  var key = tense + ':' + term.key;
  return {
    term: term,
    key: key,
    question: function (container) {
      var answers = term[tense];
      var nAnswers = answers.length;
      var maxlen = reduce(
          answers, function (a, b) { return Math.max(a.length, b); }, 0);
      var inputs = map(
          range(0, answers.length),
          function (idx) {
            return '<span><input type=text size=' + maxlen
                + ' name=answer value="" id="answer-' + idx + '">';
          });
      var tensePhrase = tense.replace(/[a-z][A-Z]/, function (letters) {
          return letters.charAt(0) + ' '
              + String.fromCharCode(letters.charCodeAt(1) + 32)
        });
      container.innerHTML = 'Conjugate the <b>' + html(tensePhrase)
          + '</b> tense of the verb <b>' + (term.esp) + '</b>, which means "'
          + html(term.eng) + '"?'
          + '<form onsubmit="var form=this;setTimeout(function () {'
          + 'fc.checkAnswer(' + js(key) + ',form,' + jsArray(answers)
          + ',form.parentNode)'
          + '}, 0);return false;">'
          + '<table><tr><td>' + inputs.slice(0, nAnswers / 2).join('<br>')
          + '<td>' + inputs.slice(nAnswers / 2).join('<br>') + '</table>'
          + '<input type=submit value="Fin">'
          + '</select></form>';
    }
  };
}

function shuffle(arr) {
  var n = arr.length;
  for (var i = arr.length; --i >= 0;) {
    var j = Math.min((Math.random() * n) | 0, n - 1);
    var t = arr[i];
    arr[i] = arr[j];
    arr[j] = t;
  }
  assert(arr.length === n);
}
