#!/usr/bin/env bash
#
# desplegar_importacion.sh
#
# Copia el script PHP de importación y el fichero GIFT de ejercicios a un
# servidor Moodle remoto, coloca el script en admin/cli/ y lo ejecuta con
# los parámetros indicados.
#
# USO (cuestionario ya existente):
#   ./desplegar_importacion.sh \
#       --quizid=345 \
#       --moodle-root=/var/www/html/moodle \
#       --category="Repaso Programming I"
#
# USO (crear el cuestionario en el mismo paso):
#   ./desplegar_importacion.sh \
#       --courseid=12 --quizname="Repaso Programming I" \
#       --moodle-root=/var/www/html/moodle \
#       --category="Repaso Programming I" --section=2
#
# Por defecto busca junto a este script:
#   - importar_gift_a_quiz.php
#   - cuestionario.txt
# (se pueden indicar otras rutas con --php-script y --gift-file).
#
# Requiere: acceso SSH por clave (o que puedas introducir la contraseña) al
# usuario root de wild.ucm.es, y conocer la ruta de instalación de Moodle
# en ese servidor (--moodle-root).

set -euo pipefail

# --- Valores por defecto -----------------------------------------------

REMOTE_HOST="wild.ucm.es"
REMOTE_USER="root"
MOODLE_ROOT="/datos/moodle"
CLI_SUBDIR="admin/cli"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PHP_SCRIPT_LOCAL="${SCRIPT_DIR}/importar_gift_a_quiz.php"
GIFT_FILE_LOCAL="${SCRIPT_DIR}/cuestionario.txt"
COURSEID=""
QUIZID=""
QUIZNAME=""
SECTION="0"
CATEGORY=""
PHP_BIN="php"
WWW_USER="wwwrun"

uso() {
    cat <<EOF
Uso: $(basename "$0") (--quizid=CMID | --courseid=ID --quizname="Nombre") [opciones]

Obligatorios (uno de los dos):
  --quizid=CMID          cmid de un cuestionario YA EXISTENTE.
                         No hace falta --courseid: se deduce del cuestionario.
  --quizname="Nombre"    nombre para CREAR un cuestionario nuevo.
                         Requiere también --courseid=ID.

Opcionales:
  --moodle-root=RUTA     ruta absoluta a la raíz de Moodle en el remoto
                         (por defecto: ${MOODLE_ROOT})
  --host=HOST            servidor remoto (por defecto: ${REMOTE_HOST})
  --user=USUARIO         usuario SSH (por defecto: ${REMOTE_USER})
  --gift-file=RUTA       fichero GIFT local a subir
                         (por defecto: ${GIFT_FILE_LOCAL})
  --php-script=RUTA      script PHP local a subir
                         (por defecto: ${PHP_SCRIPT_LOCAL})
  --category="Nombre"    nombre de la categoría del banco de preguntas
  --section=N            sección del curso donde crear el cuestionario
                         (solo con --quizname; por defecto 0)
  --www-user=USUARIO     usuario del servidor web en el remoto, con el que
                         se ejecuta el script PHP vía "sudo -u"
                         (por defecto: ${WWW_USER}; usa --www-user="" para
                         ejecutar directamente como root)
  -h, --help             muestra esta ayuda
EOF
}

# --- Parseo de argumentos -------------------------------------------------

for arg in "$@"; do
    case "$arg" in
        --courseid=*)   COURSEID="${arg#*=}" ;;
        --quizid=*)     QUIZID="${arg#*=}" ;;
        --quizname=*)   QUIZNAME="${arg#*=}" ;;
        --moodle-root=*) MOODLE_ROOT="${arg#*=}" ;;
        --host=*)       REMOTE_HOST="${arg#*=}" ;;
        --user=*)       REMOTE_USER="${arg#*=}" ;;
        --gift-file=*)  GIFT_FILE_LOCAL="${arg#*=}" ;;
        --php-script=*) PHP_SCRIPT_LOCAL="${arg#*=}" ;;
        --category=*)   CATEGORY="${arg#*=}" ;;
        --section=*)    SECTION="${arg#*=}" ;;
        --www-user=*)   WWW_USER="${arg#*=}" ;;
        -h|--help)      uso; exit 0 ;;
        *)
            echo "Parámetro no reconocido: $arg" >&2
            uso
            exit 1
            ;;
    esac
done

# --- Validaciones ----------------------------------------------------------

if [[ -z "$QUIZID" && -z "$QUIZNAME" ]]; then
    echo "Error: indica --quizid o --quizname" >&2; uso; exit 1
fi

if [[ -n "$QUIZID" && -n "$QUIZNAME" ]]; then
    echo "Error: indica --quizid o --quizname, no ambos" >&2; uso; exit 1
fi

if [[ -n "$QUIZNAME" && -z "$COURSEID" ]]; then
    echo "Error: --quizname requiere también --courseid" >&2; uso; exit 1
fi

if [[ ! -f "$PHP_SCRIPT_LOCAL" ]]; then
    echo "Error: no encuentro el script PHP local: $PHP_SCRIPT_LOCAL" >&2; exit 1
fi

if [[ ! -f "$GIFT_FILE_LOCAL" ]]; then
    echo "Error: no encuentro el fichero GIFT local: $GIFT_FILE_LOCAL" >&2; exit 1
fi

REMOTE="${REMOTE_USER}@${REMOTE_HOST}"
REMOTE_TMP="/tmp/import_gift_$$"
REMOTE_GIFT_PATH="${REMOTE_TMP}/$(basename "$GIFT_FILE_LOCAL")"
REMOTE_PHP_TMP_PATH="${REMOTE_TMP}/$(basename "$PHP_SCRIPT_LOCAL")"
REMOTE_PHP_FINAL_PATH="${MOODLE_ROOT%/}/${CLI_SUBDIR}/$(basename "$PHP_SCRIPT_LOCAL")"

# --- 1. Crear directorio temporal remoto y subir ficheros ------------------

echo ">> Conectando a ${REMOTE} y creando directorio temporal..."
ssh "$REMOTE" "mkdir -p $(printf '%q' "$REMOTE_TMP")"

echo ">> Subiendo fichero GIFT (${GIFT_FILE_LOCAL})..."
scp -q "$GIFT_FILE_LOCAL" "${REMOTE}:${REMOTE_TMP}/"

echo ">> Subiendo script PHP (${PHP_SCRIPT_LOCAL})..."
scp -q "$PHP_SCRIPT_LOCAL" "${REMOTE}:${REMOTE_TMP}/"

echo ">> Ajustando permisos del directorio temporal para que ${WWW_USER:-root} pueda leerlo..."
ssh "$REMOTE" "chmod 755 $(printf '%q' "$REMOTE_TMP") && chmod 644 $(printf '%q' "$REMOTE_GIFT_PATH") $(printf '%q' "$REMOTE_PHP_TMP_PATH")"

# --- 2. Instalar el script PHP dentro de admin/cli/ -------------------------

echo ">> Instalando el script en ${CLI_SUBDIR}/ dentro de Moodle..."
INSTALL_CMD="cp $(printf '%q' "$REMOTE_PHP_TMP_PATH") $(printf '%q' "$REMOTE_PHP_FINAL_PATH")"
if [[ -n "$WWW_USER" ]]; then
    INSTALL_CMD="${INSTALL_CMD} && chown ${WWW_USER}:${WWW_USER} $(printf '%q' "$REMOTE_PHP_FINAL_PATH")"
fi
ssh "$REMOTE" "$INSTALL_CMD"

# --- 3. Construir los parámetros del script PHP -----------------------------

PHP_ARGS=()
if [[ -n "$QUIZID" ]]; then
    PHP_ARGS+=(--quizid="$QUIZID")
else
    PHP_ARGS+=(--courseid="$COURSEID")
    PHP_ARGS+=(--quizname="$QUIZNAME")
    PHP_ARGS+=(--section="$SECTION")
fi
PHP_ARGS+=(--file="$REMOTE_GIFT_PATH")
if [[ -n "$CATEGORY" ]]; then
    PHP_ARGS+=(--category="$CATEGORY")
fi

QUOTED_ARGS=""
for a in "${PHP_ARGS[@]}"; do
    QUOTED_ARGS+=" $(printf '%q' "$a")"
done

if [[ -n "$WWW_USER" ]]; then
    REMOTE_RUN_CMD="sudo -u ${WWW_USER} ${PHP_BIN} $(printf '%q' "$REMOTE_PHP_FINAL_PATH")${QUOTED_ARGS}"
else
    REMOTE_RUN_CMD="${PHP_BIN} $(printf '%q' "$REMOTE_PHP_FINAL_PATH")${QUOTED_ARGS}"
fi

# --- 4. Ejecutar la importación ---------------------------------------------

echo ">> Ejecutando en el servidor:"
echo "   ${REMOTE_RUN_CMD}"
echo
ssh -t "$REMOTE" "$REMOTE_RUN_CMD"

# --- 5. Limpieza del directorio temporal remoto -----------------------------

echo ">> Borrando directorio temporal remoto ${REMOTE_TMP}..."
ssh "$REMOTE" "rm -rf $(printf '%q' "$REMOTE_TMP")"

echo ">> Hecho."
