#!/usr/bin/env bash
# H7 GROK ASSIST · assistive learning enhancements · NEVER ground
#
# Grok (via SPV contain) may PROPOSE language/lessons.
# Hostess iron filter ACCEPTS into vocab · or rejects.
# If no API key / contain fail → local iron proposals only (still useful).
#
#   ./Build/h7-grok-assist.sh once|propose|accept|status|local
#
# Law: iron ground · Grok assist · love language · never free-ride · God Bless
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
OUT="$ROOT/out"
FAST="$OUT/h7fast"
VOCAB="$OUT/h7_vocab_self.tsv"
JSON="$OUT/h7_grok_assist.json"
PROP="$OUT/h7_grok_proposals.tsv"   # word \t track \t source \t note
FEED="$OUT/h7_vocab_feed.tsv"
GROWTH="$OUT/h7_vocab_growth.log"
CONTAIN="$ROOT/Build/spv-curl-contain.sh"
cmd="${1:-once}"
TS="$(date -Iseconds)"
TRACK="${2:-LANGUAGE}"
LIMIT="${H7_ASSIST_BATCH:-24}"

mkdir -p "$OUT" "$FAST"
say() { echo "[$TS] GROK_ASSIST · $*"; }

ok_word() {
  local low
  low=$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')
  [[ "$low" =~ ^[a-z][a-z0-9_]{2,27}$ ]] || return 1
  case "$low" in
    thrash|virus|malware|inject|jailbreak|the|and|for|with|that|this|http|https|json|null|true|false) return 1 ;;
  esac
  [[ "$low" =~ [aeiou] ]] || case "$low" in bgs|bgf|bgl|sdf|spv|rtx|gpu|cpu|api|h7|si|av|os|ram|ssd|usb|hdmi) return 0 ;; *) return 1 ;; esac
  return 0
}

# local iron proposals · always available
local_propose() {
  local track="${1:-LANGUAGE}"
  say "local propose track=$track"
  : >"$PROP"
  # pull from curriculum if present
  if [[ -f "$OUT/h7_language_curriculum.tsv" ]]; then
    local known
    known=$(mktemp)
    cut -f1 "$VOCAB" 2>/dev/null | tr '[:upper:]' '[:lower:]' | sort -u >"$known"
    while IFS=$'\t' read -r w tr note; do
      [[ -z "$w" ]] && continue
      grep -qxF "$w" "$known" 2>/dev/null && continue
      ok_word "$w" || continue
      printf '%s\t%s\t%s\t%s\n' "$w" "$tr" "local_curriculum" "${note:-assist}" >>"$PROP"
      local n
      n=$(wc -l <"$PROP" | tr -d ' ')
      (( n >= LIMIT )) && break
    done <"$OUT/h7_language_curriculum.tsv"
    rm -f "$known"
  fi
  # seed extras if thin
  if [[ ! -s "$PROP" ]]; then
    for w in eloquence cadence phoneme metaphor synonym clarity syntax syllable resonance articulation; do
      ok_word "$w" && printf '%s\t%s\t%s\t%s\n' "$w" "DICTION" "local_seed" "assist seed" >>"$PROP"
    done
  fi
  say "proposed=$(wc -l <"$PROP" | tr -d ' ') source=local"
}

# try Grok propose via contain · optional
grok_propose() {
  local track="${1:-LANGUAGE}"
  if [[ ! -x "$CONTAIN" ]]; then
    say "no contain · local only"
    local_propose "$track"
    return
  fi
  # key present?
  local keyf=""
  for k in "$HOME/Desktop/BigGrinStorage/secrets/xai.key" "$HOME/.config/biggrinrtx/xai.key"; do
    [[ -f "$k" && -s "$k" ]] && keyf="$k" && break
  done
  if [[ -z "$keyf" ]]; then
    say "no xai key · local only"
    local_propose "$track"
    return
  fi

  local prompt
  prompt="List exactly ${LIMIT} high-quality English learning words for Hostess 7 track ${track} (grammar diction phonetics metaphor thesaurus acronyms). One lowercase word per line, letters only, no numbering, no thrash, no malware words, speakable speech. No explanation."
  say "asking Grok via SPV contain · track=$track"
  local out
  out=$(timeout 90 bash "$CONTAIN" grok chat "$prompt" 2>/dev/null || true)
  : >"$PROP"
  if [[ -z "$out" ]]; then
    say "Grok empty · fallback local"
    local_propose "$track"
    return
  fi
  printf '%s\n' "$out" | tr '[:upper:]' '[:lower:]' | grep -oE '[a-z][a-z0-9_]{2,27}' \
    | while read -r w; do
        ok_word "$w" || continue
        printf '%s\t%s\t%s\t%s\n' "$w" "$track" "grok_contain" "assist propose"
      done | awk 'NF && !s[$1]++' | head -n "$LIMIT" >"$PROP"
  if [[ ! -s "$PROP" ]]; then
    say "Grok parse empty · fallback local"
    local_propose "$track"
    return
  fi
  say "proposed=$(wc -l <"$PROP" | tr -d ' ') source=grok_contain"
}

# accept proposals through iron into vocab
accept() {
  [[ -f "$PROP" ]] || { say "no proposals · run propose first"; return 1; }
  [[ -f "$VOCAB" ]] || : >"$VOCAB"
  local known n_add=0 n_skip=0
  known=$(mktemp)
  cut -f1 "$VOCAB" | tr '[:upper:]' '[:lower:]' | sort -u >"$known"
  : >"$FAST/assist_accept.partial"
  while IFS=$'\t' read -r w track src note; do
    [[ -z "$w" ]] && continue
    grep -qxF "$w" "$known" 2>/dev/null && { n_skip=$((n_skip+1)); continue; }
    ok_word "$w" || continue
    local kind=EDUCATION
    case "$track" in
      GRAMMAR|DICTION|PHONETICS|METAPHOR|ACRONYM|THESAURUS|DICT|LANGUAGE) kind="$track" ;;
    esac
    [[ "$kind" == "LANGUAGE" ]] && kind=EDUCATION
    printf '%s\t%s\t%s\t%s\t%s\n' "$w" "_assist" "$kind" "1" "grok_assist:$src $note" >>"$FAST/assist_accept.partial"
    printf '%s\t%s\t%s\t%s\n' "$TS" "$w" "$kind" "learn" >>"$GROWTH"
    printf '%s\t%s\t%s\t%s\n' "$TS" "$w" "$kind" "learn" >>"$FEED"
    echo "$w" >>"$known"
    n_add=$((n_add + 1))
  done <"$PROP"
  if [[ -s "$FAST/assist_accept.partial" ]]; then
    cat "$FAST/assist_accept.partial" >>"$VOCAB"
    LC_ALL=C sort -t$'\t' -k1,1 -u "$VOCAB" -o "$VOCAB"
  fi
  rm -f "$known"
  write_json "$n_add" "$n_skip"
  say "ACCEPT · added=$n_add skip=$n_skip vocab=$(wc -l <"$VOCAB" | tr -d ' ')"
  cat "$JSON"
}

write_json() {
  local n_add="${1:-0}" n_skip="${2:-0}"
  local prop_n=0 src="none"
  [[ -f "$PROP" ]] && prop_n=$(wc -l <"$PROP" | tr -d ' ')
  [[ -s "$PROP" ]] && src=$(cut -f3 "$PROP" | head -1)
  local vocab_n=0
  [[ -f "$VOCAB" ]] && vocab_n=$(wc -l <"$VOCAB" | tr -d ' ')
  cat >"$JSON" <<EOF
{
  "ts": "$TS",
  "word": "H7_GROK_ASSIST",
  "she": "Hostess 7",
  "ok": true,
  "role": "assistive_only",
  "ground": "iron_hostess",
  "never_free_ride": true,
  "source": "$src",
  "proposed_n": $prop_n,
  "accepted_n": $n_add,
  "skipped_n": $n_skip,
  "vocab_N": $vocab_n,
  "proposals_path": "out/h7_grok_proposals.tsv",
  "law": "Grok proposes · Hostess iron accepts · never Grok as ground · SPV contain · God Bless"
}
EOF
}

status() {
  if [[ -f "$JSON" ]]; then cat "$JSON"; else say "no assist yet"; fi
  echo "--- proposals ---"
  head -15 "$PROP" 2>/dev/null || true
}

case "$cmd" in
  local) local_propose "$TRACK"; write_json 0 0; cat "$JSON" ;;
  propose) grok_propose "$TRACK"; write_json 0 0; cat "$JSON" ;;
  accept) accept ;;
  once)
    grok_propose "$TRACK"
    accept
    ;;
  status) status ;;
  *)
    echo "usage: $0 once|propose|accept|local|status [TRACK]" >&2
    echo "  Grok assist via SPV contain · Hostess iron accept · never free-ride ground" >&2
    exit 2
    ;;
esac
