#!/usr/bin/env sh
set -eu

usage() {
  cat <<'EOF'
Uso:
  ./scripts/files-permissions.sh --path /ruta/files --owner wappcom --group wappcom --web-user www-data

Opciones:
  --path       Ruta absoluta de la carpeta files (requerido)
  --owner      Usuario owner deseado para files (default: wappcom)
  --group      Grupo deseado para files (default: wappcom)
  --web-user   Usuario del proceso web/php-fpm para agregar al grupo (opcional)
  --no-usermod No ejecutar usermod aunque se provea --web-user
  --dry-run    Solo muestra acciones, no aplica cambios
  --help       Muestra esta ayuda

Qué hace:
  1) Mantiene owner/group definidos
  2) Aplica 2775 a directorios (setgid para heredar grupo)
  3) Aplica 0664 a archivos
  4) Verifica escritura efectiva para owner y (si aplica) web-user
EOF
}

log() { printf '%s\n' "$*"; }
err() { printf 'ERROR: %s\n' "$*" >&2; }

run() {
  if [ "$DRY_RUN" = "1" ]; then
    printf '[dry-run] %s\n' "$*"
  else
    # shellcheck disable=SC2086
    sh -c "$*"
  fi
}

require_cmd() {
  command -v "$1" >/dev/null 2>&1 || {
    err "No se encontró el comando requerido: $1"
    exit 1
  }
}

# Configuración por defecto (puedes editar estos valores)
DEFAULT_OWNER="wappcom"
DEFAULT_GROUP="wappcom"
DEFAULT_WEB_USER=""

PATH_TARGET=""
OWNER="$DEFAULT_OWNER"
GROUP="$DEFAULT_GROUP"
WEB_USER="$DEFAULT_WEB_USER"
DO_USERMOD="1"
DRY_RUN="0"

while [ "$#" -gt 0 ]; do
  case "$1" in
    --path) PATH_TARGET="${2:-}"; shift 2 ;;
    --owner) OWNER="${2:-}"; shift 2 ;;
    --group) GROUP="${2:-}"; shift 2 ;;
    --web-user) WEB_USER="${2:-}"; shift 2 ;;
    --no-usermod) DO_USERMOD="0"; shift 1 ;;
    --dry-run) DRY_RUN="1"; shift 1 ;;
    --help|-h) usage; exit 0 ;;
    *)
      err "Opción no reconocida: $1"
      usage
      exit 1
      ;;
  esac
done

if [ -z "$PATH_TARGET" ]; then
  err "Debes indicar --path"
  usage
  exit 1
fi

if [ "${PATH_TARGET#/}" = "$PATH_TARGET" ]; then
  err "--path debe ser absoluto"
  exit 1
fi

if [ ! -d "$PATH_TARGET" ]; then
  err "La ruta no existe o no es directorio: $PATH_TARGET"
  exit 1
fi

require_cmd chown
require_cmd chmod
require_cmd find
require_cmd id

if ! id "$OWNER" >/dev/null 2>&1; then
  err "Owner no existe: $OWNER"
  exit 1
fi

if ! getent group "$GROUP" >/dev/null 2>&1; then
  err "Grupo no existe: $GROUP"
  exit 1
fi

log "Aplicando permisos en: $PATH_TARGET"
log "Owner: $OWNER"
log "Group: $GROUP"

run "chown -R '$OWNER':'$GROUP' '$PATH_TARGET'"
run "find '$PATH_TARGET' -type d -exec chmod 2775 {} \\;"
run "find '$PATH_TARGET' -type f -exec chmod 0664 {} \\;"

if [ -n "$WEB_USER" ] && [ "$DO_USERMOD" = "1" ]; then
  require_cmd usermod
  if ! id "$WEB_USER" >/dev/null 2>&1; then
    err "web-user no existe: $WEB_USER"
    exit 1
  fi
  log "Agregando web-user al grupo: $WEB_USER -> $GROUP"
  run "usermod -aG '$GROUP' '$WEB_USER'"
fi

log "Verificando acceso owner..."
if [ "$DRY_RUN" = "0" ]; then
  su -s /bin/sh -c "test -w '$PATH_TARGET'" "$OWNER" || {
    err "Owner $OWNER no puede escribir en $PATH_TARGET"
    exit 1
  }
fi

if [ -n "$WEB_USER" ] && [ "$DRY_RUN" = "0" ]; then
  log "Verificando acceso web-user..."
  su -s /bin/sh -c "test -w '$PATH_TARGET'" "$WEB_USER" || {
    err "web-user $WEB_USER no puede escribir en $PATH_TARGET (puede requerir reinicio de servicio)"
    exit 1
  }
fi

log "OK: permisos aplicados correctamente."
log "Si se agregó grupo al web-user, reinicia php-fpm/apache para refrescar grupos de proceso."
