#!/bin/bash
set -euo pipefail

ryvion_allow_docker_fallback() {
  case "${RYV_ALLOW_DOCKER_FALLBACK:-}" in
    1|true|TRUE|yes|YES|on|ON)
      return 0
      ;;
    *)
      return 1
      ;;
  esac
}

get_ryvion_oci_engine_cli() {
  if [[ -n "${RYV_RUNTIME_ENGINE_BINARY:-}" && -x "${RYV_RUNTIME_ENGINE_BINARY}" ]]; then
    printf '%s\n' "${RYV_RUNTIME_ENGINE_BINARY}"
    return 0
  fi
  for candidate in nerdctl podman; do
    if command -v "$candidate" >/dev/null 2>&1; then
      command -v "$candidate"
      return 0
    fi
  done
  for candidate in /usr/local/bin/nerdctl /usr/local/bin/podman /usr/bin/nerdctl /usr/bin/podman /snap/bin/nerdctl /snap/bin/podman; do
    if [[ -x "$candidate" ]]; then
      printf '%s\n' "$candidate"
      return 0
    fi
  done
  if ryvion_allow_docker_fallback; then
    if command -v docker >/dev/null 2>&1; then
      command -v docker
      return 0
    fi
    for candidate in /usr/local/bin/docker /usr/bin/docker /snap/bin/docker; do
      if [[ -x "$candidate" ]]; then
        printf '%s\n' "$candidate"
        return 0
      fi
    done
  fi
  return 1
}

get_ryvion_oci_engine_kind() {
  local engine_cli="${1:-}"
  if [[ -z "$engine_cli" ]]; then
    engine_cli="$(get_ryvion_oci_engine_cli || true)"
  fi
  if [[ -z "$engine_cli" ]]; then
    return 1
  fi
  local engine_name
  engine_name="$(basename "$engine_cli")"
  engine_name="${engine_name%%.*}"
  case "$engine_name" in
    podman*)
      printf '%s\n' "podman"
      ;;
    docker*)
      printf '%s\n' "docker"
      ;;
    nerdctl*)
      printf '%s\n' "nerdctl"
      ;;
    *)
      printf '%s\n' "unknown"
      ;;
  esac
}

translate_ryvion_oci_args() {
  local engine_kind="$1"
  shift
  local converted=()
  while [[ $# -gt 0 ]]; do
    case "$1" in
      --gpus)
        if [[ "$engine_kind" == "podman" && $# -gt 1 ]]; then
          local gpu_value="$2"
          if [[ -n "$gpu_value" && "$gpu_value" != "off" && "$gpu_value" != "none" ]]; then
            converted+=(--device "nvidia.com/gpu=$gpu_value")
          fi
          shift 2
          continue
        fi
        ;;
      --gpus=*)
        if [[ "$engine_kind" == "podman" ]]; then
          local gpu_value="${1#--gpus=}"
          if [[ -n "$gpu_value" && "$gpu_value" != "off" && "$gpu_value" != "none" ]]; then
            converted+=(--device "nvidia.com/gpu=$gpu_value")
          fi
          shift
          continue
        fi
        ;;
    esac
    converted+=("$1")
    shift
  done
  printf '%s\n' "${converted[@]}"
}

if [[ $# -eq 0 ]]; then
  echo "OCI backend arguments are required" >&2
  exit 1
fi

engine_cli="$(get_ryvion_oci_engine_cli || true)"
if [[ -z "$engine_cli" ]]; then
  echo "managed OCI engine is not available" >&2
  exit 1
fi
engine_kind="$(get_ryvion_oci_engine_kind "$engine_cli" || true)"
mapfile -t converted_args < <(translate_ryvion_oci_args "$engine_kind" "$@")

exec "$engine_cli" "${converted_args[@]}"
