#!/usr/bin/env bash
set -Eeuo pipefail

# Crea un sitio MacroBase para un cliente:
# - Estructura: /var/www/html/<PROYECTO>/<MODULO>
# - Clona/actualiza repo (origin main)
# - Prepara parameters.yml con credenciales de BD
# - Ejecuta composer (update parcial para mbinv) + install
# - Ajusta permisos, assets y parches DBAL opcionales
#
# Uso:
#   bash create_site.sh -p <proyecto> -m <modulo> -u <db_user> -k <db_pass> [-H <db_host>] [-P <db_port>] [-r <root_dir>] [-s]
# Valores por defecto: modulo=mbinv, db_host=127.0.0.1, db_port=3306, root_dir=/var/www/html

PROYECTO=""
MODULO="mbinv"
DB_USER=""
DB_PASS=""
DB_HOST="127.0.0.1"
DB_PORT="3306"
ROOT_DIR="/var/www/html"

usage(){
  cat << EOF
Uso: $(basename "$0") -p <proyecto> -u <db_user> -k <db_pass> [-m <modulo>] [-H <db_host>] [-P <db_port>] [-r <root_dir>] [-s]
EOF
}

USE_SUDO=0
while getopts ":p:m:u:k:H:P:r:sh" opt; do
  case $opt in
    p) PROYECTO="$OPTARG" ;;
    m) MODULO="$OPTARG" ;;
    u) DB_USER="$OPTARG" ;;
    k) DB_PASS="$OPTARG" ;;
    H) DB_HOST="$OPTARG" ;;
    P) DB_PORT="$OPTARG" ;;
    r) ROOT_DIR="$OPTARG" ;;
    s) USE_SUDO=1 ;;
    h) usage; exit 0 ;;
    *) usage; exit 1 ;;
  esac
done

if [[ -z "$PROYECTO" || -z "$DB_USER" || -z "$DB_PASS" ]]; then
  usage; echo "Faltan parámetros obligatorios" >&2; exit 1
fi

set -x
if [[ "$USE_SUDO" == "1" ]]; then SUDO=sudo; else SUDO=""; fi

SITE_DIR="$ROOT_DIR/$PROYECTO/$MODULO"
REPO_URL="https://github.com/macrobasegt/${MODULO}.git"

${SUDO} mkdir -p "$SITE_DIR" || true
cd "$SITE_DIR"

if [[ ! -d .git ]]; then
  ${SUDO} git init
  ${SUDO} git remote add origin "$REPO_URL" -t main || true
  ${SUDO} git pull origin main
else
  ${SUDO} git fetch --all --prune
  ${SUDO} git checkout main
  ${SUDO} git reset --hard origin/main
fi

# Composer
if [[ ! -f composer.phar ]]; then
  ${SUDO} wget -q https://getcomposer.org/download/2.2.23/composer.phar
fi
php composer.phar -V || true

if [[ "$MODULO" == "mbinv" ]]; then
  if [[ -f composer.lock ]]; then ${SUDO} cp composer.lock composer.lock.pre-bk || true; fi
  ${SUDO} rm -f composer.lock || true
  ${SUDO} php composer.phar update --no-scripts --no-progress || true
  php composer.phar show knplabs/knp-snappy-bundle --locked || true
  php composer.phar show knplabs/knp-snappy --locked || true
fi

# Preparar parameters.yml si no existe
PARAM_DIR="app/config"
PARAM_FILE="$PARAM_DIR/parameters.yml"
PARAM_DIST="$PARAM_DIR/parameters.yml.dist"
DB_NAME="mbinv${PROYECTO}"

if [[ ! -f "$PARAM_FILE" ]]; then
  if [[ -f "$PARAM_DIST" ]]; then
    ${SUDO} cp "$PARAM_DIST" "$PARAM_FILE"
  else
    ${SUDO} mkdir -p "$PARAM_DIR"
    ${SUDO} touch "$PARAM_FILE"
    echo "parameters:" | ${SUDO} tee "$PARAM_FILE" >/dev/null
  fi
  ${SUDO} sed -i -E "s#(^\s*database_host:).*#\1 '$DB_HOST'#" "$PARAM_FILE" || true
  ${SUDO} sed -i -E "s#(^\s*database_port:).*#\1 '$DB_PORT'#" "$PARAM_FILE" || true
  ${SUDO} sed -i -E "s#(^\s*database_name:).*#\1 '$DB_NAME'#" "$PARAM_FILE" || true
  ${SUDO} sed -i -E "s#(^\s*database_user:).*#\1 '$DB_USER'#" "$PARAM_FILE" || true
  ${SUDO} sed -i -E "s#(^\s*database_password:).*#\1 '$DB_PASS'#" "$PARAM_FILE" || true
fi

${SUDO} php composer.phar install --no-interaction
${SUDO} php app/console assets:install --symlink web || true

# POSTouch específico (si aplica)
if [[ -d web/bundles/touchpos ]]; then
  ${SUDO} mkdir -p web/bundles/touchpos/images_menu || true
  ${SUDO} chown www-data:www-data web/bundles/touchpos/images_menu/ -R || true
fi

# Permisos
${SUDO} chmod 777 -R app/cache || true
${SUDO} chmod 777 -R app/logs || true
${SUDO} chmod 777 -R web/ || true

# Parches DBAL (si existen fuentes en web/)
if [[ -f web/DateType.php && -d vendor/doctrine/dbal/lib/Doctrine/DBAL/Types ]]; then
  ${SUDO} cp web/DateType.php vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/ || true
fi
if [[ -f web/DateTimeType.php && -d vendor/doctrine/dbal/lib/Doctrine/DBAL/Types ]]; then
  ${SUDO} cp web/DateTimeType.php vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/ || true
fi

set +x
echo "\n✅ Sitio creado en: $SITE_DIR"
echo "   Repo: $REPO_URL"
echo "   DB:   $DB_NAME@$DB_HOST:$DB_PORT (usuario: $DB_USER)"

exit 0
