#!/usr/bin/env bash
# Rulează PE SERVER Listara: importă un dump .sql
# Usage: DB_PUSH_MODE=merge bash import-local-db-full-replace.sh /tmp/listara.sql
#
# merge  — importă tabelele din dump; users/listings rămân pe producție (implicit)
# replace — backup → DROP DATABASE → CREATE → import complet

set -euo pipefail

SQL_FILE="${1:-}"
if [[ -z "${SQL_FILE}" || ! -f "${SQL_FILE}" ]]; then
  echo "Usage: DB_PUSH_MODE=merge $0 /path/to/dump.sql" >&2
  exit 1
fi

DB_PUSH_MODE="${DB_PUSH_MODE:-merge}"

APP_ROOT="${APP_ROOT:-/opt/apps/main-updater}"
ENV_FILE="${ENV_FILE:-${APP_ROOT}/.env}"
BACKUP_DIR="${BACKUP_DIR:-${APP_ROOT}/deploy-backups}"

if [[ ! -f "${ENV_FILE}" ]]; then
  echo "Missing .env: ${ENV_FILE}" >&2
  exit 1
fi

read_env() {
  local key="$1" default="${2:-}"
  local val
  val="$(grep -E "^${key}=" "${ENV_FILE}" | tail -1 | cut -d= -f2- | tr -d "\"'" || true)"
  if [[ -n "${val}" ]]; then
    printf '%s' "${val}"
  else
    printf '%s' "${default}"
  fi
}

DB_HOST="$(read_env DB_HOST 127.0.0.1)"
DB_PORT="$(read_env DB_PORT 3306)"
DB_DATABASE="$(read_env DB_DATABASE)"
DB_USERNAME="$(read_env DB_USERNAME)"
DB_PASSWORD="$(read_env DB_PASSWORD)"

if [[ -z "${DB_DATABASE}" || -z "${DB_USERNAME}" ]]; then
  echo "DB_DATABASE / DB_USERNAME missing in ${ENV_FILE}" >&2
  exit 1
fi

MYSQL_BIN="${MYSQL_BIN:-mysql}"
MYSQLDUMP_BIN="${MYSQLDUMP_BIN:-mysqldump}"

mysql_args=(-h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USERNAME}")
dump_args=(-h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USERNAME}" --single-transaction --routines --triggers)
if [[ -n "${DB_PASSWORD}" ]]; then
  mysql_args+=(-p"${DB_PASSWORD}")
  dump_args+=(-p"${DB_PASSWORD}")
fi

mkdir -p "${BACKUP_DIR}"
STAMP="$(date +%Y%m%d-%H%M%S)"
BACKUP_FILE="${BACKUP_DIR}/db-before-push-${STAMP}.sql"

echo "[db-push] Backup baza curentă (${DB_DATABASE}) → ${BACKUP_FILE}"
if "${MYSQLDUMP_BIN}" "${dump_args[@]}" "${DB_DATABASE}" > "${BACKUP_FILE}"; then
  echo "[db-push] Backup OK ($(wc -c < "${BACKUP_FILE}" | tr -d ' ') bytes)"
else
  echo "[db-push] Backup eșuat — oprire." >&2
  exit 1
fi

if [[ "${DB_PUSH_MODE}" == "replace" ]]; then
  echo "[db-push] Mod REPLACE: DROP + CREATE DATABASE \`${DB_DATABASE}\`"
  "${MYSQL_BIN}" "${mysql_args[@]}" -e \
    "DROP DATABASE IF EXISTS \`${DB_DATABASE}\`; CREATE DATABASE \`${DB_DATABASE}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
else
  echo "[db-push] Mod MERGE: păstrează tabelele excluse din dump (users, listings, …)"
fi

echo "[db-push] Import ${SQL_FILE} (ignor CREATE DATABASE / USE din dump)"
sed -E '/^CREATE DATABASE /Id; /^USE `/Id' "${SQL_FILE}" | "${MYSQL_BIN}" "${mysql_args[@]}" "${DB_DATABASE}"

TABLE_COUNT="$("${MYSQL_BIN}" "${mysql_args[@]}" -N -e \
  "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='${DB_DATABASE}';")"
USER_COUNT="$("${MYSQL_BIN}" "${mysql_args[@]}" -N -e \
  "SELECT COUNT(*) FROM \`${DB_DATABASE}\`.\`users\`" 2>/dev/null || echo "n/a")"
LISTING_COUNT="$("${MYSQL_BIN}" "${mysql_args[@]}" -N -e \
  "SELECT COUNT(*) FROM \`${DB_DATABASE}\`.\`listings\`" 2>/dev/null || echo "n/a")"

echo "[db-push] Gata. Tabele: ${TABLE_COUNT} | users: ${USER_COUNT} | listings: ${LISTING_COUNT}"
echo "[db-push] Recomandat: cd ${APP_ROOT} && sudo -u www-data php artisan optimize:clear"
