!7

cmodule GeneralDefinitions {
  transient S term;
  transient JPanel stack;
  transient OptionalInputPanel inputPanel;
  transient S listName = generalDefinitions_listName();
  transient int maxResults = 500;

  start {
    dm_useLocallyCopiedMechLists();
    dm_onTopInput(rstUpdate());
  }
  
  visualize {
    inputPanel = new OptionalInputPanel(this);
    onEnter(inputPanel.tfInput, r addADefinition);
    stack = dynamicVStack2();
    ret northCenterAndSouth(
      inputPanel.panel,
      jscroll_trackWidth(stack),
      withMargin(jcenteredbuttons("Add definition...", r addADefinition, "All definitions", r {
        showText("All definitions",
          ai_renderDefinitions(
            values(mechMultiMapPairsCI(listName)),
            values(mechMultiMapPairsCI("Unauthorized Appends | " + listName))))
      })));
  }
  
  void update {
    if (stack == null) ret;
    replaceAllComponents(stack, ll(fontSize(17,
      jCenteredMultiLineLabel(makeText(term = inputPanel.input())))));
  }
  
  S makeText(fS query) {
    if (empty(query)) ret "";
    MultiMap<S, Pair<S>> map = mechMultiMapPairsCI(listName);
    L<Pair<S>> answers = definitions_dropInvalidatedFromPairs(map.get(query));
    MultiMap<S, Pair<S>> map2 = mechMultiMapPairsCI("Unauthorized Appends | " + listName);
    L<Pair<S>> answers2 = definitions_dropInvalidatedFromPairs(map2.get(query));
    S text = trim(ai_renderDefinitions(answers, answers2)
      + "\n"
      + prependIfNempty("Possibly related:\n", lines(concatLists(
        scoredSearch2(maxResults, query, map(func(Pair<S> p) -> S { ai_renderDefinition(p.a, p.b, false) }, listMinusSet(definitions_dropInvalidatedFromPairs(values(map)), answers))),
        scoredSearch2(maxResults, query, map(func(Pair<S> p) -> S { ai_renderDefinition(p.a, p.b, true) }, listMinusSet(definitions_dropInvalidatedFromPairs(values(map2)), answers2)))))));
    
    ret empty(text) ? "No definitions found for " + quote(query) : text;
  }
  
  void addADefinition {
    temp enter();
    fS t = term;
    final JTextField tfWord = jtextfield(t), tfDefinition = jtextfield();
    showFormTitled("Add Definition",
      "Word/Phrase:", tfWord,
      "Definition:", tfDefinition,
      rThread {
        S word = gtt(tfWord), def = gtt(tfDefinition);
        Pair<Bool, S> p = generalDefinitions_add(word, def);
        infoBox(p.b);
        if (p.a) updateMe();
      });
    requestFocus(tfDefinition);
  }
}