#!/usr/bin/env bash
# Exportă DB locală (fără users/listings) și o importă pe Listara în mod merge.
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=common.sh
source "${SCRIPT_DIR}/common.sh"
# shellcheck source=db-push-excludes.sh
source "${SCRIPT_DIR}/db-push-excludes.sh"

load_config

load_local_db_config() {
  local env_file="${PROJECT_ROOT}/.env"
  [[ -f "${env_file}" ]] || die "Missing .env for local database export"

  LOCAL_DB_HOST="$(grep -E '^DB_HOST=' "${env_file}" | cut -d= -f2- | tr -d "\"'" || echo '127.0.0.1')"
  LOCAL_DB_PORT="$(grep -E '^DB_PORT=' "${env_file}" | cut -d= -f2- | tr -d "\"'" || echo '3306')"
  LOCAL_DB_DATABASE="$(grep -E '^DB_DATABASE=' "${env_file}" | cut -d= -f2- | tr -d "\"'" || true)"
  LOCAL_DB_USERNAME="$(grep -E '^DB_USERNAME=' "${env_file}" | cut -d= -f2- | tr -d "\"'" || echo 'root')"
  LOCAL_DB_PASSWORD="$(grep -E '^DB_PASSWORD=' "${env_file}" | cut -d= -f2- | tr -d "\"'" || true)"
  : "${LOCAL_DB_DATABASE:?DB_DATABASE not set in .env}"
}

load_local_db_config

DB_PUSH_MODE="${DB_PUSH_MODE:-merge}"
EXCLUDE_COUNT="$(db_push_exclude_table_count)"

DUMP_BIN="${LOCAL_MYSQLDUMP_BIN:-/opt/lampp/bin/mysqldump}"
if [[ ! -x "${DUMP_BIN}" ]]; then
  DUMP_BIN="$(command -v mysqldump || true)"
fi
[[ -n "${DUMP_BIN}" ]] || die "mysqldump negăsit (instalează XAMPP/LAMPP sau set LOCAL_MYSQLDUMP_BIN)"

SQL_FILE="${DEPLOY_DIR}/backups/local-to-listara-$(date +%Y%m%d-%H%M%S).sql"
mkdir -p "${DEPLOY_DIR}/backups"

log "Export DB locală: ${LOCAL_DB_DATABASE} (mod: ${DB_PUSH_MODE}, exclude ${EXCLUDE_COUNT} tabele users/listings)"
DUMP_ARGS=(-h"${LOCAL_DB_HOST}" -P"${LOCAL_DB_PORT}" -u"${LOCAL_DB_USERNAME}"
  --single-transaction --routines --triggers)
while IFS= read -r -d '' ignore_arg; do
  DUMP_ARGS+=("${ignore_arg}")
done < <(db_push_append_ignore_args "${LOCAL_DB_DATABASE}")
DUMP_ARGS+=("${LOCAL_DB_DATABASE}")
[[ -n "${LOCAL_DB_PASSWORD}" ]] && DUMP_ARGS=(-p"${LOCAL_DB_PASSWORD}" "${DUMP_ARGS[@]}")
"${DUMP_BIN}" "${DUMP_ARGS[@]}" > "${SQL_FILE}"

LOCAL_LISTINGS="$(grep -c "INSERT INTO \`listings\`" "${SQL_FILE}" 2>/dev/null || echo "0")"
LOCAL_USERS="$(grep -c "INSERT INTO \`users\`" "${SQL_FILE}" 2>/dev/null || echo "0")"
log "Dump salvat: ${SQL_FILE}"
log "Verificare exclude: listings inserts=${LOCAL_LISTINGS}, users inserts=${LOCAL_USERS} (trebuie 0)"

if [[ "${LOCAL_LISTINGS}" != "0" || "${LOCAL_USERS}" != "0" ]]; then
  warn "Dump-ul conține încă users/listings — verifică DB_PUSH_EXCLUDE_TABLES"
fi

REMOTE_TMP="/tmp/listara-db-import.sql"
log "Upload → ${DEPLOY_USER}@${DEPLOY_HOST}:${REMOTE_TMP}"
if [[ -n "${SSH_CONFIG_FILE:-}" && -f "${SSH_CONFIG_FILE}" ]]; then
  scp -F "${SSH_CONFIG_FILE}" "${SQL_FILE}" "${DEPLOY_USER}@${DEPLOY_HOST}:${REMOTE_TMP}"
else
  scp -i "${SSH_KEY_PATH}" -P "${DEPLOY_PORT}" \
    -o "UserKnownHostsFile=${SSH_KNOWN_HOSTS}" \
    "${SQL_FILE}" "${DEPLOY_USER}@${DEPLOY_HOST}:${REMOTE_TMP}"
fi

REMOTE_SCRIPT="/opt/apps/scripts/import-local-db-full-replace.sh"
LOCAL_SCRIPT="${PROJECT_ROOT}/deploy/linux/import-local-db-full-replace.sh"

log "Upload script import → ${REMOTE_SCRIPT}"
if [[ -n "${SSH_CONFIG_FILE:-}" && -f "${SSH_CONFIG_FILE}" ]]; then
  scp -F "${SSH_CONFIG_FILE}" "${LOCAL_SCRIPT}" "${DEPLOY_USER}@${DEPLOY_HOST}:${REMOTE_SCRIPT}"
else
  scp -i "${SSH_KEY_PATH}" -P "${DEPLOY_PORT}" \
    -o "UserKnownHostsFile=${SSH_KNOWN_HOSTS}" \
    "${LOCAL_SCRIPT}" "${DEPLOY_USER}@${DEPLOY_HOST}:${REMOTE_SCRIPT}"
fi

if [[ "${DB_PUSH_MODE}" == "replace" ]]; then
  log "Replace complet DB pe Listara (ATENȚIE: șterge tot, inclusiv users/listings)..."
else
  log "Import merge pe Listara (păstrează users + listings de pe producție)..."
fi

ssh_cmd "chmod +x ${REMOTE_SCRIPT} && DB_PUSH_MODE=${DB_PUSH_MODE} bash ${REMOTE_SCRIPT} ${REMOTE_TMP}"

log "DB sincronizată pe Listara (fără users/listings din dump)."
