!7

sS yesText = [[
  y
  yes
  yeah
  y
  yup
  yo
  correct
  sure
  ok
  affirmative
  
  ja
  ok
  richtig
  gut
  mach das
  ja ich will
  bitte
  ist so
  isso
  jau
  jawohl
  stimmt
]];

sS noText = [[
  no
  n
  nope
  negative
  don't do that
  nay
  
  nein
  nö
  negativ
  lass das
]];

static Set<S> yesLiterals = ciSet(), noLiterals = ciSet();

static Bool algo_0_1(S s) {
  if (yesLiterals.contains(s)) true;
  if (noLiterals.contains(s)) false;
  null;
}

static Bool algo_0_2(S s) {
  s = trim(s);
  try bool algo_0_1(s);
  S s2 = collapseWord(s);
  if (neq(s, s2))
    try bool algo_0_1(s2);
  null;
}

static Bool algo_0_3(S s) {
  try bool algo_0_2(s);
  S s2 = firstWord(s);
  if (neq(s, s2))
    try bool algo_0_2(s);
  null;
}

p {
  autoRestart();
  independentSmartBot();
  onNewTriple(f onTriple);
  sahara();
  consoleHeight(500);
  showMessagesInGerman(true);
  logModuleOutput();
  readLinePrefix("[] Eingabe: ");
  addAll_withCollapsed(yesLiterals, tlftj(yesText));
  addAll_withCollapsed(noLiterals, tlftj(noText));
  for (T3<S> t : triplesWithB("heißt")) onTriple(t);
  bot();
  centerBigConsole2();
  focusConsole(random(tossCoin() ? yesLiterals : noLiterals);
  controls2_default();
}

svoid controls_feedback(S text) {
  disableConsoleInput();
  hideControls2();
  showControls(withCenteredTitle("Ich glaube:",
    vstackWithSpacing(setFontSize(15, jcenteredBoldLabel(text)),
  centeredButtons(
    "Das ist korrekt", r {
      print("=> KORREKT");
      uploadOutputSinceLastInput();
      reset();
    },
    "Das ist nicht korrekt", r {
      print("=> INKORREKT");
      fS s = lastInput();
      //uploadOutputSinceLastInput();
      
      showControls(vstackWithSpacing(
        setFontSize(13, jcenteredBoldLabel("Was heißt " + quote(s) + " denn?")),
        jcenteredbuttons(
          "Es heißt Ja", r { correct(s, true) },
          "Es heißt Nein", r { correct(s, false) },
          "Es heißt was anderes", r { correct(s, null) })));
    }))));
}

answer {
  Bool b = algo_0_3(s);
  S a = formatSatz(s, b);
  controls_feedback(a);
  try answer a;
}

sS formatSatz(S s, Bool b) {
  ret quote(s) + " " + (
      isTrue(b) ? "bedeutet 'Ja'"
    : isFalse(b) ? "bedeutet 'Nein'"
    : "bedeutet weder Ja noch Nein");
}

svoid controls2_default() {
  showControls2(jcenteredlabel("Schreib doch mal was ja-iges oder nein-iges:"));
}

svoid correct(S input, Bool b) {
  print(formatSatz(input, b));
  post(quote(input), "heißt", boolSwitch(b, "ja", "nein", "weder ja noch nein"));
  uploadOutputSinceLastInput();
  reset();
}

svoid reset { 
  hideControls();
  enableConsoleInput();
  focusConsole();
}

svoid onTriple(T3<S> t) {
  if (eqic(t.b, "heißt") && isQuoted(t.a)) {
    if (eqic(t.c, "ja")) add_withCollapsed(yesLiterals, unquote(t.a));
    else if (eqic(t.c, "nein")) add_withCollapsed(noLiterals, unquote(t.a));
  }
}