#!/bin/bash
# Instalador automatico de los mods de project.paquitoservers.sbs
# ---------------------------------------------------------------
# Descarga los 96 articulos del Steam Workshop que usa el servidor y los deja
# en la carpeta de Workshop de tu Steam, para que Project Zomboid los cargue
# solo al entrar.
#
# Uso:
#     bash -c "$(curl -fsSL https://project.paquitoservers.sbs/install/install.sh)"
#
# O descargalo y ejecutalo:
#     curl -fsSL https://project.paquitoservers.sbs/install/install.sh -o install.sh
#     bash install.sh
#
# No modifica nada de tu Steam: solo escribe en
# Steam/steamapps/workshop/content/108600, que es donde el juego ya busca
# los mods.

set -uo pipefail

URL_IDS="https://project.paquitoservers.sbs/install/workshop_ids.txt"
APP_ID=108600
RAIZ="${XDG_DATA_HOME:-$HOME/.local/share}/PaquiProject"

verde()  { printf '\033[0;32m%s\033[0m\n' "$*"; }
cian()   { printf '\033[0;36m%s\033[0m\n' "$*"; }
rojo()   { printf '\033[0;31m%s\033[0m\n' "$*"; }
gris()   { printf '\033[0;90m%s\033[0m\n' "$*"; }

echo
verde "  Instalador de mods - project.paquitoservers.sbs"
verde "  -----------------------------------------------"
echo

# ---------------------------------------------------------------- Steam
buscar_steam() {
  local candidatos=(
    "$HOME/.steam/steam"
    "$HOME/.local/share/Steam"
    "$HOME/.steam/root"
    "/usr/local/share/Steam"
  )
  for c in "${candidatos[@]}"; do
    [ -d "$c" ] && echo "$c" && return 0
  done
  return 1
}

STEAM="$(buscar_steam || true)"
if [ -z "$STEAM" ]; then
  rojo "No encuentro tu instalacion de Steam."
  rojo "En Linux, normalmente esta en ~/.steam/steam o ~/.local/share/Steam."
  exit 1
fi
verde "Steam encontrado en: $STEAM"

DESTINO="${1:-$STEAM/steamapps/workshop/content/$APP_ID}"
mkdir -p "$DESTINO"
gris "  Destino: $DESTINO"

# --------------------------------------------------------------- ids
cian "Descargando la lista de mods..."
IDS_FILE="$(mktemp)"
if curl -fsSL "$URL_IDS" -o "$IDS_FILE"; then
  IDS="$(grep -E '^[0-9]+$' "$IDS_FILE" || true)"
else
  rojo "  No se pudo descargar la lista."
  IDS=""
fi
rm -f "$IDS_FILE"
if [ -z "$IDS" ]; then
  rojo "  Sin lista de ids: revisa la conexion."
  exit 1
fi
CUANTOS=$(echo "$IDS" | wc -l | tr -d ' ')
verde "  $CUANTOS mods en la lista."

# ---------------------------------------------------------- steamcmd
STEAMCMD="$RAIZ/steamcmd"
EXE="$STEAMCMD/steamcmd.sh"
if [ ! -x "$EXE" ]; then
  cian "Descargando SteamCMD..."
  mkdir -p "$STEAMCMD"
  TMP="$(mktemp -d)"
  if curl -fsSL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_latest.tar.gz" -o "$TMP/s.tgz"; then
    tar -xzf "$TMP/s.tgz" -C "$STEAMCMD"
    chmod +x "$EXE"
  else
    rojo "  No se pudo descargar SteamCMD."
    rm -rf "$TMP"
    exit 1
  fi
  rm -rf "$TMP"
  verde "SteamCMD listo."
fi

# ------------------------------------------------------------ descarga
cian "Descargando $CUANTOS articulos del Workshop. Puede tardar entre 10 y 60 minutos..."
ARGUMENTOS=("+force_install_dir" "$DESTINO" "+login" "anonymous" "+@ShutdownOnFailedCommand" "0")
while read -r id; do
  [ -z "$id" ] && continue
  ARGUMENTOS+=("+workshop_download_item" "$APP_ID" "$id")
done <<< "$IDS"
ARGUMENTOS+=("+quit")

LOG="$RAIZ/steamcmd.log"
mkdir -p "$RAIZ"
"$EXE" "${ARGUMENTOS[@]}" 2>&1 | tee "$LOG" >/dev/null

# ------------------------------------------------------- comprobacion
INSTALADOS=$(find "$DESTINO" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l | tr -d ' ')
echo
verde "  Instalados: $INSTALADOS mod(s) en $DESTINO"

PENDIENTES=0
while read -r id; do
  [ -z "$id" ] && continue
  [ -d "$DESTINO/$id" ] || { PENDIENTES=$((PENDIENTES + 1)); }
done <<< "$IDS"

if [ "$PENDIENTES" -gt 0 ]; then
  rojo "  No se pudieron descargar $PENDIENTES."
  gris "  Puedes bajarlos a mano desde el catalogo de la web."
fi

echo
verde "Listo. Abre Project Zomboid, entra al servidor y los mods se cargaran solos."
gris "El log esta en: $LOG"
