#!/bin/bash
set -euo pipefail

ensure_downloader() {
  if command -v curl >/dev/null 2>&1; then
    echo curl
    return
  fi

  if command -v wget >/dev/null 2>&1; then
    echo wget
    return
  fi

  if command -v apt >/dev/null 2>&1; then
    apt update >/dev/null 2>&1
    apt install -y curl >/dev/null 2>&1
  elif command -v yum >/dev/null 2>&1; then
    yum install -y curl >/dev/null 2>&1
  elif command -v dnf >/dev/null 2>&1; then
    dnf install -y curl >/dev/null 2>&1
  elif command -v apk >/dev/null 2>&1; then
    apk add --no-cache curl >/dev/null 2>&1
  else
    echo "Unsupported package manager for downloader installation" >&2
    exit 1
  fi

  if command -v curl >/dev/null 2>&1; then
    echo curl
    return
  fi

  echo "Failed to install curl" >&2
  exit 1
}

download_file() {
  local url="$1"
  local target="$2"
  local downloader
  downloader=$(ensure_downloader)

  if [[ "$downloader" == "curl" ]]; then
    curl -fsSL "$url" -o "$target"
  else
    wget -qO "$target" "$url"
  fi
}

ensure_docker() {
  if command -v docker >/dev/null 2>&1; then
    return
  fi

  local installer="/tmp/get-docker.sh"
  download_file "https://get.docker.com" "$installer"
  sh "$installer"
  rm -f "$installer"
}

ensure_docker_service() {
  if command -v systemctl >/dev/null 2>&1; then
    systemctl daemon-reload >/dev/null 2>&1 || true
    systemctl enable docker >/dev/null 2>&1 || true
    systemctl restart docker >/dev/null 2>&1 || systemctl start docker >/dev/null 2>&1
  elif command -v service >/dev/null 2>&1; then
    service docker start >/dev/null 2>&1 || true
  fi
}

ensure_compose_plugin() {
  if docker compose version >/dev/null 2>&1; then
    return
  fi

  local os arch version plugin_dir plugin_path
  os=$(uname -s | tr '[:upper:]' '[:lower:]')
  arch=$(uname -m)

  case "$arch" in
    x86_64|amd64) arch="x86_64" ;;
    aarch64|arm64) arch="aarch64" ;;
    *)
      echo "Unsupported architecture for docker compose plugin: $arch" >&2
      exit 1
      ;;
  esac

  version="v2.29.7"
  plugin_dir="/usr/local/lib/docker/cli-plugins"
  plugin_path="${plugin_dir}/docker-compose"

  mkdir -p "$plugin_dir"
  download_file "https://github.com/docker/compose/releases/download/${version}/docker-compose-${os}-${arch}" "$plugin_path"
  chmod +x "$plugin_path"
}

ensure_compose_shim() {
  if command -v docker-compose >/dev/null 2>&1; then
    return
  fi

  cat > /usr/local/bin/docker-compose <<'EOF'
#!/bin/sh
exec docker compose "$@"
EOF
  chmod +x /usr/local/bin/docker-compose
}

ensure_docker
ensure_docker_service
ensure_compose_plugin
ensure_compose_shim

docker version >/dev/null 2>&1
docker compose version >/dev/null 2>&1
docker-compose version >/dev/null 2>&1
