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

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

if [[ ! -f "${ROOT_DIR}/artisan" ]]; then
  echo "Run this script from the repository root." >&2
  exit 1
fi

ZIP_PATH="${1:-}"
MODE="${2:-}"
if [[ -z "${ZIP_PATH}" ]]; then
  echo "Usage: ./importSandboxSeed.sh /path/to/sandbox-seed.zip [--assets-only]" >&2
  exit 1
fi

if [[ ! -f "${ZIP_PATH}" ]]; then
  echo "Zip file not found: ${ZIP_PATH}" >&2
  exit 1
fi

if ! command -v unzip >/dev/null 2>&1; then
  echo "unzip is required to extract the bundle." >&2
  exit 1
fi

if ! command -v php >/dev/null 2>&1; then
  echo "php is required to read .env" >&2
  exit 1
fi

if [[ "${MODE}" != "--assets-only" ]]; then
  if ! command -v mysql >/dev/null 2>&1; then
    echo "mysql client is required to import the database." >&2
    exit 1
  fi
fi

eval "$(
  php -r '
    require __DIR__ . "/vendor/autoload.php";
    $dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
    $dotenv->load();
    $keys = [
      "DB_CONNECTION","DB_HOST","DB_PORT","DB_DATABASE","DB_USERNAME","DB_PASSWORD",
      "FILESYSTEM_DISK","MEDIA_DISK","FILAMENT_FILESYSTEM_DRIVER","MEDIA_PREFIX",
      "AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN",
      "AWS_DEFAULT_REGION","AWS_REGION","AWS_BUCKET","AWS_ENDPOINT","AWS_USE_PATH_STYLE_ENDPOINT",
      "S3_ASSETS_PREFIX",
    ];
    foreach ($keys as $key) {
      $value = $_ENV[$key] ?? "";
      if ($value !== "") {
        echo "export {$key}=" . escapeshellarg($value) . PHP_EOL;
      }
    }
  '
)"

if [[ "${MODE}" != "--assets-only" ]]; then
  if [[ "${DB_CONNECTION:-mysql}" != "mysql" ]]; then
    echo "This script only supports MySQL connections. Current: ${DB_CONNECTION:-unknown}" >&2
    exit 1
  fi

  DB_HOST="${DB_HOST:-127.0.0.1}"
  DB_PORT="${DB_PORT:-3306}"

  if [[ -z "${DB_DATABASE:-}" || -z "${DB_USERNAME:-}" ]]; then
    echo "Missing DB_DATABASE or DB_USERNAME in .env." >&2
    exit 1
  fi
fi

TMP_DIR="$(mktemp -d)"
cleanup() {
  rm -rf "${TMP_DIR}"
}
trap cleanup EXIT

unzip -q "${ZIP_PATH}" -d "${TMP_DIR}"

if [[ "${MODE}" != "--assets-only" ]]; then
  SQL_FILE="$(find "${TMP_DIR}" -type f -name 'sandbox-seed-*.sql' -o -name '*.sql' | head -n 1)"
  if [[ -z "${SQL_FILE}" ]]; then
    echo "No SQL dump found inside zip." >&2
    exit 1
  fi

  MYSQL_ARGS=()
  if [[ "${SANDBOX_IMPORT_FORCE:-0}" == "1" ]]; then
    MYSQL_ARGS+=(--force)
    echo "Importing with --force (missing tables will be skipped)."
  fi

  MYSQL_PWD="${DB_PASSWORD:-}" mysql "${MYSQL_ARGS[@]}" \
    -h "${DB_HOST}" \
    -P "${DB_PORT}" \
    -u "${DB_USERNAME}" \
    "${DB_DATABASE}" \
    < "${SQL_FILE}"
fi

ASSETS_SRC="${TMP_DIR}/storage/app/public"
if [[ -d "${ASSETS_SRC}" ]]; then
  USE_S3=0
  if [[ "${MEDIA_DISK:-}" == "s3" || "${FILESYSTEM_DISK:-}" == "s3" || "${FILAMENT_FILESYSTEM_DRIVER:-}" == "s3" ]]; then
    USE_S3=1
  fi

  if [[ "${USE_S3}" -eq 1 ]]; then
    if ! command -v aws >/dev/null 2>&1; then
      echo "aws CLI is required to upload assets to S3." >&2
      exit 1
    fi
    if [[ -z "${AWS_BUCKET:-}" ]]; then
      echo "AWS_BUCKET is required to upload assets to S3." >&2
      exit 1
    fi
    S3_PREFIX="${S3_ASSETS_PREFIX:-${MEDIA_PREFIX:-}}"
    S3_PREFIX="${S3_PREFIX#/}"
    S3_DEST="s3://${AWS_BUCKET}"
    if [[ -n "${S3_PREFIX}" ]]; then
      S3_DEST="${S3_DEST}/${S3_PREFIX}"
    fi
    AWS_ARGS=()
    if [[ -n "${AWS_ENDPOINT:-}" ]]; then
      AWS_ARGS+=(--endpoint-url "${AWS_ENDPOINT}")
    fi
    if [[ -n "${S3_SYNC_ACL:-}" ]]; then
      AWS_ARGS+=(--acl "${S3_SYNC_ACL}")
    fi
    if [[ "${AWS_USE_PATH_STYLE_ENDPOINT:-false}" == "true" ]]; then
      export AWS_S3_FORCE_PATH_STYLE=1
    fi
    if [[ "${S3_SYNC_FORCE:-0}" == "1" ]]; then
      aws s3 cp "${AWS_ARGS[@]}" --recursive "${ASSETS_SRC}/" "${S3_DEST}" >/dev/null
    else
      aws s3 sync "${AWS_ARGS[@]}" "${ASSETS_SRC}/" "${S3_DEST}" >/dev/null
    fi
  else
    ASSETS_DEST="${ROOT_DIR}/storage/app/public"
    mkdir -p "${ASSETS_DEST}"
    if command -v rsync >/dev/null 2>&1; then
      rsync -a --delete "${ASSETS_SRC}/" "${ASSETS_DEST}/"
    else
      rm -rf "${ASSETS_DEST:?}/"*
      cp -a "${ASSETS_SRC}/." "${ASSETS_DEST}/"
    fi
  fi
else
  echo "No assets directory found in bundle. Skipping assets sync."
fi

php artisan storage:link >/dev/null

if [[ "${MODE}" == "--assets-only" ]]; then
  echo "Assets sync complete."
else
  echo "Import complete."
fi
