#!/usr/bin/env bash
# Publica la tienda de un cliente en un dominio: vhost de Apache + certificado SSL.
#
#   sudo deploy/alta-tienda.sh <dominio> [--puerto 7500] [--email ops@novasispy.com] [--dry]
#
# Ejemplo: sudo deploy/alta-tienda.sh comercial-kety.factupy.es
#
# Requisitos (ver deploy/ALTA-TIENDA.md):
#   1. El DNS del dominio ya apunta a este servidor (registro A o CNAME).
#   2. En el panel, Ecommerce → Configuración: el dominio cargado en «Dominio propio»
#      (o el subdominio, si el dominio cuelga del ROOT_DOMAIN de la tienda).
#
# Es idempotente: si el vhost o el certificado ya existen, no los toca.
set -euo pipefail

DOMINIO="${1:-}"
PUERTO=7500
EMAIL="${CERTBOT_EMAIL:-}"
DRY=0
shift || true
while [[ $# -gt 0 ]]; do
  case "$1" in
    --puerto) PUERTO="$2"; shift 2 ;;
    --email) EMAIL="$2"; shift 2 ;;
    --dry) DRY=1; shift ;;
    *) echo "Opción desconocida: $1" >&2; exit 2 ;;
  esac
done

if [[ -z "$DOMINIO" || ! "$DOMINIO" =~ ^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$ ]]; then
  echo "Uso: $0 <dominio> [--puerto 7500] [--email correo] [--dry]" >&2
  exit 2
fi

correr() { if [[ $DRY == 1 ]]; then echo "  [dry] $*"; else eval "$@"; fi; }
CONF="/etc/apache2/sites-available/${DOMINIO}.conf"
SLUG="${DOMINIO%%.*}"

echo "1/5 DNS de ${DOMINIO}"
IP_SERVIDOR="$(curl -s --max-time 5 https://api.ipify.org || true)"
IP_DNS="$(getent ahostsv4 "$DOMINIO" | awk 'NR==1{print $1}' || true)"
if [[ -z "$IP_DNS" ]]; then
  echo "  ✗ ${DOMINIO} no resuelve. Cargá el registro DNS y esperá que propague."
  [[ $DRY == 1 ]] || exit 1
elif [[ -n "$IP_SERVIDOR" && "$IP_DNS" != "$IP_SERVIDOR" ]]; then
  echo "  ✗ ${DOMINIO} apunta a ${IP_DNS}, pero este servidor es ${IP_SERVIDOR}."
  [[ $DRY == 1 ]] || exit 1
else
  echo "  ✓ apunta a ${IP_DNS}"
fi

echo "2/5 La tienda reconoce ${DOMINIO} (puerto ${PUERTO})"
# Responde 200 aunque el dominio no sea de nadie (muestra «No encontramos esta tienda»):
# hay que mirar el título de la página, no sólo el código.
TITULO="$(curl -s -H "Host: ${DOMINIO}" "http://localhost:${PUERTO}/" | grep -o '<title>[^<]*</title>' | head -1 | sed -E 's#</?title>##g' || true)"
if [[ -z "$TITULO" ]]; then
  echo "  ✗ Novasis-Store no respondió. ¿Está corriendo pm2 Novasis-Store?"
  [[ $DRY == 1 ]] || exit 1
elif [[ "$TITULO" == "Tienda no encontrada" ]]; then
  echo "  ✗ Ninguna tienda tiene este dominio. Cargalo en el panel (Ecommerce → Configuración → Dominio propio) y guardá."
  [[ $DRY == 1 ]] || exit 1
else
  echo "  ✓ es la tienda de «${TITULO}»"
fi

echo "3/5 Virtual host ${CONF}"
if [[ -f "$CONF" ]]; then
  echo "  ✓ ya existe, no se modifica"
else
  VHOST="<VirtualHost *:80>
    ServerName ${DOMINIO}
    ProxyPreserveHost On
    ProxyPass / http://localhost:${PUERTO}/
    ProxyPassReverse / http://localhost:${PUERTO}/
    ErrorLog \${APACHE_LOG_DIR}/${SLUG}-error.log
    CustomLog \${APACHE_LOG_DIR}/${SLUG}-access.log combined
</VirtualHost>"
  if [[ $DRY == 1 ]]; then echo "  [dry] escribiría:"; echo "$VHOST" | sed 's/^/        /'; else echo "$VHOST" > "$CONF"; echo "  ✓ creado"; fi
  correr a2ensite "${DOMINIO}.conf" ">/dev/null"
fi

echo "4/5 Recargar Apache"
correr apache2ctl configtest
correr systemctl reload apache2

echo "5/5 Certificado SSL"
if [[ -d "/etc/letsencrypt/live/${DOMINIO}" ]]; then
  echo "  ✓ ya tiene certificado"
else
  EMAIL_ARG=$([[ -n "$EMAIL" ]] && echo "-m $EMAIL" || echo "--register-unsafely-without-email")
  correr certbot --apache -d "$DOMINIO" -n --agree-tos --redirect "$EMAIL_ARG"
fi

[[ $DRY == 1 ]] && echo "Simulación terminada: no se cambió nada." || echo "Listo: https://${DOMINIO}"
