#!/usr/bin/env bash
# Crea_Confronto_Cartelle.sh
# Ubuntu + Zenity: genera un file .meldcmp per confrontare due cartelle con Meld
# Requisiti: zenity, coreutils (realpath o readlink)
# Memorizza ultime scelte (SINISTRA, DESTRA e cartella di salvataggio) accanto allo script.

set -u  # niente -e: gestiamo annullamenti manualmente

# --- Controlli preliminari -------------------------------------------------
if ! command -v zenity >/dev/null 2>&1; then
  echo "Errore: 'zenity' non è installato. Installa con: sudo apt install zenity" >&2
  exit 1
fi

# --- Utilità ---------------------------------------------------------------

# Directory dove risiede questo script
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
STATE_FILE="$SCRIPT_DIR/.Crea_Confronto_Cartelle.state"

# Legge valore salvato o ritorna default
get_saved_value() {
  local key="$1" default="$2"
  if [[ -f "$STATE_FILE" ]]; then
    local line
    line="$(grep -m1 -E "^${key}=" "$STATE_FILE" 2>/dev/null || true)"
    if [[ -n "$line" ]]; then
      printf '%s\n' "${line#*=}"
      return 0
    fi
  fi
  printf '%s\n' "$default"
}

# Salva/aggiorna key=value (con escape per slash/simboli sed)
save_state() {
  local key="$1" value="$2"
  mkdir -p -- "$SCRIPT_DIR"
  if [[ -f "$STATE_FILE" ]]; then
    if grep -q -E "^${key}=" "$STATE_FILE"; then
      local esc_value
      esc_value="$(printf '%s' "$value" | sed -e 's/[\/&]/\\&/g')"
      sed -i -E "s|^(${key}=).*|\1${esc_value}|" "$STATE_FILE"
    else
      printf '%s=%s\n' "$key" "$value" >> "$STATE_FILE"
    fi
  else
    printf '%s=%s\n' "$key" "$value" > "$STATE_FILE"
  fi
}

# Normalizza percorso directory:
# - assoluto se possibile
# - singola slash iniziale e finale
# - compattazione slash multipli
normalize_path() {
  local p="$1"
  if command -v realpath >/dev/null 2>&1; then
    p="$(realpath -m -- "$p" 2>/dev/null || printf '%s' "$p")"
  elif command -v readlink >/dev/null 2>&1; then
    p="$(readlink -f -- "$p" 2>/dev/null || printf '%s' "$p")"
  fi
  p="${p%/}"
  [[ "$p" = /* ]] || p="/$p"
  p="$(printf '%s' "$p" | sed -E 's#/+#/#g')"
  p="$p/"
  printf '%s\n' "$p"
}

# Messaggio e uscita
abort_msg() {
  zenity --error --title="Operazione annullata" --text="$1" 2>/dev/null || true
  exit 1
}

# Conferma sovrascrittura (ritorna 0 = prosegui, 1 = annulla)
confirm_overwrite() {
  local path="$1"
  zenity --question --title="Conferma sovrascrittura" \
    --text="Il file esiste già:\n$path\n\nVuoi sovrascriverlo?" 2>/dev/null
}

# --- Flusso principale -----------------------------------------------------

# Default: Home o ultime scelte
LEFT_DEFAULT="$(get_saved_value 'SINISTRA' "$HOME")"
RIGHT_DEFAULT="$(get_saved_value 'DESTRA'   "$HOME")"
SAVE_DIR_DEFAULT="$(get_saved_value 'SALVA_DIR' "$HOME")"

# Selezione SINISTRA
LEFT_CHOSEN="$(zenity --file-selection \
  --title="Seleziona la cartella SINISTRA" \
  --directory \
  --filename="${LEFT_DEFAULT%/}/" 2>/dev/null || true)"
[[ -n "${LEFT_CHOSEN:-}" ]] || abort_msg "Nessuna cartella SINISTRA selezionata."

# Selezione DESTRA
RIGHT_CHOSEN="$(zenity --file-selection \
  --title="Seleziona la cartella DESTRA" \
  --directory \
  --filename="${RIGHT_DEFAULT%/}/" 2>/dev/null || true)"
[[ -n "${RIGHT_CHOSEN:-}" ]] || abort_msg "Nessuna cartella DESTRA selezionata."

# Normalizza percorsi
LEFT_NORM="$(normalize_path "$LEFT_CHOSEN")"
RIGHT_NORM="$(normalize_path "$RIGHT_CHOSEN")"

# Salva per la prossima esecuzione
save_state "SINISTRA" "$LEFT_NORM"
save_state "DESTRA"   "$RIGHT_NORM"

# --- Salvataggio in due step per mostrare davvero il nome predefinito -----

# 1) scegli la CARTELLA di salvataggio (default: ultima usata o $HOME)
SAVE_DIR="$(zenity --file-selection \
  --title="Scegli la CARTELLA di salvataggio" \
  --directory \
  --filename="${SAVE_DIR_DEFAULT%/}/" 2>/dev/null || true)"
[[ -n "${SAVE_DIR:-}" ]] || abort_msg "Salvataggio annullato."
# Normalizza cartella di salvataggio (senza forzare slash finale in join)
if command -v realpath >/dev/null 2>&1; then
  SAVE_DIR="$(realpath -m -- "$SAVE_DIR" 2>/dev/null || printf '%s' "$SAVE_DIR")"
elif command -v readlink >/dev/null 2>&1; then
  SAVE_DIR="$(readlink -f -- "$SAVE_DIR" 2>/dev/null || printf '%s' "$SAVE_DIR")"
fi
SAVE_DIR="${SAVE_DIR%/}"

# 2) chiedi il NOME file con default mostrato
DEFAULT_BASENAME="Meld_CCC.meldcmp"
BASENAME="$(zenity --entry \
  --title="Nome del file .meldcmp" \
  --text="Inserisci il nome del file da salvare:" \
  --entry-text="$DEFAULT_BASENAME" 2>/dev/null || true)"
[[ -n "${BASENAME:-}" ]] || abort_msg "Salvataggio annullato."

# Assicura estensione .meldcmp
case "$BASENAME" in
  *.meldcmp) : ;;
  *) BASENAME="${BASENAME}.meldcmp" ;;
esac

OUTFILE="${SAVE_DIR}/${BASENAME}"

# Conferma sovrascrittura se serve
if [[ -e "$OUTFILE" ]]; then
  if ! confirm_overwrite "$OUTFILE"; then
    abort_msg "Salvataggio annullato dall'utente."
  fi
fi

# Ricorda la cartella di salvataggio
save_state "SALVA_DIR" "$SAVE_DIR"

# --- Genera contenuto .meldcmp --------------------------------------------
CONTENT="[Comparison]
type = Folder
uris = file://${LEFT_NORM};file://${RIGHT_NORM}
"

printf '%s' "$CONTENT" > "$OUTFILE" || abort_msg "Impossibile scrivere il file:\n$OUTFILE"

# Conferma finale
zenity --info --title="Creato" --no-wrap \
  --text="File di confronto creato:\n$OUTFILE\n\nSINISTRA → $LEFT_NORM\nDESTRA   → $RIGHT_NORM" 2>/dev/null || true

exit 0
