#!/usr/bin/env bash
# =============================================================================
# agy-chat.sh — pi <-> agy multi-turn conversation wrapper
#
# Permette a pi (agente principale) di conversare avanti e indietro con agy
# (subagent), mantenendo la memoria della conversazione tra i turni.
#
# USO:
#   ./agy-chat.sh "prompt"                 # avvia o continua la conversazione
#   ./agy-chat.sh --new "prompt"           # forza una nuova conversazione
#   ./agy-chat.sh --model "Gemini 3.1 Pro (High)" "prompt"
#   ./agy-chat.sh --effort high "prompt"
#   ./agy-chat.sh --id                     # stampa l'ID conversazione corrente
#   ./agy-chat.sh --list                   # elenca le conversazioni recenti
#   ./agy-chat.sh --resume <id> "prompt"   # riprende una conversazione specifica
#   ./agy-chat.sh --reset                  # azzera lo stato (parte da zero)
#
# VARIABILI:
#   AGY_CHAT_STATE   cartella di stato (default ~/.agy-chat)
#   AGY_BIN          percorso del binario agy (default: agy su PATH)
# =============================================================================
set -uo pipefail

STATE_DIR="${AGY_CHAT_STATE:-$HOME/.agy-chat}"
STATE_FILE="$STATE_DIR/conversation_id"
DB="${AGY_CHAT_DB:-$HOME/.gemini/antigravity-cli/conversation_summaries.db}"
CONV_DIR="${AGY_CHAT_CONV_DIR:-$HOME/.gemini/antigravity-cli/conversations}"
AGY_BIN="${AGY_BIN:-agy}"
mkdir -p "$STATE_DIR"

# --- helper: ultimo conversation_id (dal file .db più recente in conversations/) ---
latest_id() {
  # il nome del file .db nella cartella conversations è l'ID conversazione
  ls -t "$CONV_DIR"/*.db 2>/dev/null | head -1 | xargs -r -n1 basename 2>/dev/null | sed 's/\.db$//'
}

# --- helper: elenca conversazioni recenti ------------------------------------
list_convs() {
  if [[ ! -d "$CONV_DIR" ]] || [[ -z "$(ls -A "$CONV_DIR"/*.db 2>/dev/null)" ]]; then
    echo "(nessuna conversazione trovata)"
    return 0
  fi
  for f in $(ls -t "$CONV_DIR"/*.db 2>/dev/null); do
    id="$(basename "$f" .db)"
    mtime="$(stat -c '%y' "$f" 2>/dev/null | cut -d. -f1)"
    echo "$id\t$mtime"
  done
}

# --- parse argomenti ----------------------------------------------------------
NEW=0
MODEL=""
EFFORT=""
RESUME_ID=""
PROMPT=""
ADD_DIRS=()
YOLO=0

while [[ $# -gt 0 ]]; do
  case "$1" in
    --new)        NEW=1; shift ;;
    --reset)      rm -f "$STATE_FILE"; echo "stato azzerato"; exit 0 ;;
    --id)         if [[ -f "$STATE_FILE" ]]; then cat "$STATE_FILE"; else echo "(nessuna conversazione attiva)"; fi; exit 0 ;;
    --list)       list_convs; exit 0 ;;
    --model)      MODEL="$2"; shift 2 ;;
    --effort)     EFFORT="$2"; shift 2 ;;
    --resume)     RESUME_ID="$2"; shift 2 ;;
    --add-dir)    ADD_DIRS+=("$2"); shift 2 ;;
    --yolo)       YOLO=1; shift ;;
    *)            PROMPT="$PROMPT $1"; shift ;;
  esac
done
PROMPT="$(echo "$PROMPT" | sed 's/^ *//;s/ *$//')"

if [[ -z "$PROMPT" ]]; then
  echo "uso: ./agy-chat.sh [--new] [--model NOME] [--effort low|medium|high] \"prompt\"" >&2
  exit 1
fi

# --- determina conversation_id da usare ---------------------------------------
CONV_ID=""
if [[ $NEW -eq 0 && -z "$RESUME_ID" && -f "$STATE_FILE" ]]; then
  CONV_ID="$(cat "$STATE_FILE")"
elif [[ -n "$RESUME_ID" ]]; then
  CONV_ID="$RESUME_ID"
fi

# --- costruisci comando -------------------------------------------------------
CMD=("$AGY_BIN" -p "$PROMPT")
for d in "${ADD_DIRS[@]}"; do
  CMD+=(--add-dir "$d")
done
if [[ -n "$CONV_ID" ]]; then
  CMD+=(--conversation "$CONV_ID")
fi
if [[ -n "$MODEL" ]]; then
  CMD+=(--model "$MODEL")
fi
if [[ -n "$EFFORT" ]]; then
  CMD+=(--effort "$EFFORT")
fi
if [[ $YOLO -eq 1 ]]; then
  CMD+=(--dangerously-skip-permissions)
fi

echo ">>> agy (conversation: ${CONV_ID:-nuova})" >&2
OUTPUT="$("${CMD[@]}" 2>&1)"
RC=$?

# --- stampa output ------------------------------------------------------------
if [[ -n "$OUTPUT" ]]; then
  echo "$OUTPUT"
fi

# --- aggiorna stato con l'ultimo conversation_id ------------------------------
if [[ $RC -eq 0 ]]; then
  NEW_ID="$(latest_id)"
  if [[ -n "$NEW_ID" ]]; then
    echo "$NEW_ID" > "$STATE_FILE"
  fi
else
  # se fallisce per mancato login, avvisa
  if echo "$OUTPUT" | grep -qiE "sign in|signin|authenticate|login|Authentication required|visit the URL"; then
    echo "" >&2
    echo "⚠️  agy NON è autenticato. Devi fare il login UNA volta:" >&2
    echo "    1) apri un terminale e lancia:  agy" >&2
    echo "    2) visita l'URL stampato, fai login con l'account Antigravity" >&2
    echo "    3) incolla il codice di autorizzazione nel terminale" >&2
    echo "    Poi torna qui e riprova il wrapper." >&2
  fi
fi

exit $RC
