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

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
APP_CONFIG_FILE="$ROOT_DIR/config/config.php"

if [[ $# -lt 1 ]]; then
  echo "Usage: $0 <backup.sql|backup.sql.gz>" >&2
  exit 1
fi

INPUT_FILE="$1"
if [[ ! -f "$INPUT_FILE" ]]; then
  echo "Backup file not found: $INPUT_FILE" >&2
  exit 1
fi

if ! command -v mysql >/dev/null 2>&1; then
  echo "mysql client not found. Install MySQL client tools first." >&2
  exit 1
fi

if [[ ! -f "$APP_CONFIG_FILE" ]]; then
  echo "Missing config file: $APP_CONFIG_FILE" >&2
  exit 1
fi

DB_CFG_RAW="$(APP_CONFIG_FILE="$APP_CONFIG_FILE" php -r '
  $c = require getenv("APP_CONFIG_FILE");
  $db = $c["db"] ?? [];
  echo ($db["host"] ?? "127.0.0.1"), PHP_EOL;
  echo ($db["port"] ?? "3306"), PHP_EOL;
  echo ($db["name"] ?? ""), PHP_EOL;
  echo ($db["user"] ?? ""), PHP_EOL;
  echo ($db["pass"] ?? ""), PHP_EOL;
')" 

DB_HOST_DEFAULT="$(printf '%s\n' "$DB_CFG_RAW" | sed -n '1p')"
DB_PORT_DEFAULT="$(printf '%s\n' "$DB_CFG_RAW" | sed -n '2p')"
DB_NAME_DEFAULT="$(printf '%s\n' "$DB_CFG_RAW" | sed -n '3p')"
DB_USER_DEFAULT="$(printf '%s\n' "$DB_CFG_RAW" | sed -n '4p')"
DB_PASS_DEFAULT="$(printf '%s\n' "$DB_CFG_RAW" | sed -n '5p')"

DB_HOST="${DB_HOST:-$DB_HOST_DEFAULT}"
DB_PORT="${DB_PORT:-$DB_PORT_DEFAULT}"
DB_NAME="${DB_NAME:-$DB_NAME_DEFAULT}"
DB_USER="${DB_USER:-$DB_USER_DEFAULT}"
DB_PASS="${DB_PASS:-$DB_PASS_DEFAULT}"

if [[ -z "$DB_NAME" || -z "$DB_USER" ]]; then
  echo "Database settings are missing. Set DB_NAME and DB_USER." >&2
  exit 1
fi

if [[ ! "$DB_NAME" =~ ^[A-Za-z0-9_]+$ ]]; then
  echo "Unsafe DB_NAME: $DB_NAME" >&2
  exit 1
fi

export MYSQL_PWD="$DB_PASS"

# Optional: DROP_EXISTING=1 ./scripts/db_restore.sh backup.sql.gz
if [[ "${DROP_EXISTING:-0}" == "1" ]]; then
  mysql --host="$DB_HOST" --port="$DB_PORT" --user="$DB_USER" -e "DROP DATABASE IF EXISTS \`$DB_NAME\`; CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
else
  mysql --host="$DB_HOST" --port="$DB_PORT" --user="$DB_USER" -e "CREATE DATABASE IF NOT EXISTS \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
fi

if [[ "$INPUT_FILE" == *.gz ]]; then
  gzip -dc "$INPUT_FILE" | mysql --host="$DB_HOST" --port="$DB_PORT" --user="$DB_USER" "$DB_NAME"
else
  mysql --host="$DB_HOST" --port="$DB_PORT" --user="$DB_USER" "$DB_NAME" < "$INPUT_FILE"
fi

unset MYSQL_PWD
echo "Restore completed into database: $DB_NAME"
