#!/bin/sh -e
rm -rf /opt/opentelemetry_bash 1> /dev/null 2> /dev/null || true # clean the old install directory
if [ "$1" = 'abort-configure' ] || [ "$1" = 'abort-upgrade' ] || [ "$1" = 'abort-remove' ] || [ "$1" = 'abort-deconfigure' ]; then
  true
elif [ "$1" = 'configure' ] || [ "$1" = 'triggered' ] || [ "$1" = 'reconfigure' ]; then
  export PATH=/usr/local/bin:"$PATH"
  if type node; then
    rm -rf /usr/share/opentelemetry_shell/agent.instrumentation.node/*/
    _node_archived="$(tar -tJf /usr/share/opentelemetry_shell/agent.instrumentation.node/node_modules.tar.xz 2>/dev/null | cut -d / -f 2 | grep '^[0-9]' | sort -n -u)"
    _node_versions=""
    if type docker 1>/dev/null 2>/dev/null || [ "$GITHUB_ACTIONS" = true ]; then
      _node_min="$(printf '%s\n' "$_node_archived" | sort -n | head -n 1)"
      _node_max="$(grep '^FROM ' /usr/share/opentelemetry_shell/agent.instrumentation.node/Dockerfile 2>/dev/null | cut -d ' ' -f 2 | cut -d : -f 2 | cut -d - -f 1)"
      [ -n "$_node_min" ] && [ -n "$_node_max" ] && _node_versions="$(seq "$_node_min" "$_node_max")" || true
      [ -n "$_node_versions" ] || _node_versions="$_node_archived"
    else
      _node_versions="$(echo "$PATH" | tr : '\n' | while read -r directory; do find "$directory" -name node; done | while read -r executable; do eval "$executable --version"; done | tr -d v | cut -d . -f 1 | sort -n -u)"
    fi
    printf '%s\n' "$_node_versions" | while read -r version; do
      [ -n "$version" ] || continue
      v="$version"
      while [ "$v" -gt 0 ]; do
        printf '%s\n' "$_node_archived" | grep -q "^${v}$" && break
        v=$((v - 1))
      done
      [ "$v" -gt 0 ] && printf './%s\n' "$v" || true
    done | sort -u | ( xargs -r -P 0 tar -xJf /usr/share/opentelemetry_shell/agent.instrumentation.node/node_modules.tar.xz -C /usr/share/opentelemetry_shell/agent.instrumentation.node/ || true )
    printf '%s\n' "$_node_versions" | while read -r version; do
      [ -n "$version" ] || continue
      v="$version"
      while [ "$v" -gt 0 ]; do
        printf '%s\n' "$_node_archived" | grep -q "^${v}$" && break
        v=$((v - 1))
      done
      [ "$v" -gt 0 ] && [ "$v" != "$version" ] && [ ! -d /usr/share/opentelemetry_shell/agent.instrumentation.node/"$version" ] && cp -r /usr/share/opentelemetry_shell/agent.instrumentation.node/"$v" /usr/share/opentelemetry_shell/agent.instrumentation.node/"$version" || true
    done
    ls /usr/share/opentelemetry_shell/agent.instrumentation.node | grep -v '.json$' | grep -v '.js$' | grep -v '.xz$' | grep -v 'Dockerfile$' | while read -r directory; do
      ls /usr/share/opentelemetry_shell/agent.instrumentation.node | grep '.js$' | while read -r file; do
        cp /usr/share/opentelemetry_shell/agent.instrumentation.node/"$file" /usr/share/opentelemetry_shell/agent.instrumentation.node/"$directory"/"$file"
      done
    done
  fi 2>&1 | perl -0777 -pe '' >&2 &
  if type python3; then
    rm -rf /usr/share/opentelemetry_shell/agent.instrumentation.python/*/
    _python_archived="$(tar -tJf /usr/share/opentelemetry_shell/agent.instrumentation.python/python_site_packages.tar.xz 2>/dev/null | cut -d / -f 2 | grep '^3\.' | sort -t. -k2 -n -u)"
    _python_versions=""
    if type docker 1>/dev/null 2>/dev/null || [ "$GITHUB_ACTIONS" = true ]; then
      _python_min_minor="$(printf '%s\n' "$_python_archived" | sort -t. -k2 -n | head -n 1 | cut -d . -f 2)"
      _python_max_minor="$(grep '^FROM ' /usr/share/opentelemetry_shell/agent.instrumentation.python/Dockerfile 2>/dev/null | cut -d ' ' -f 2 | cut -d : -f 2 | cut -d - -f 1 | cut -d . -f 2)"
      [ -n "$_python_min_minor" ] && [ -n "$_python_max_minor" ] && _python_versions="$(seq "$_python_min_minor" "$_python_max_minor" | while read -r v; do printf '3.%s\n' "$v"; done)" || true
      [ -n "$_python_versions" ] || _python_versions="$_python_archived"
    else
      _python_versions="$(echo "$PATH" | tr : '\n' | while read -r directory; do find "$directory" -name 'python3.*'; done | grep -v -- - | while read -r executable; do eval "$executable -V"; done | cut -d ' ' -f 2 | cut -d . -f -2 | sort -t. -k2 -n -u)"
    fi
    printf '%s\n' "$_python_versions" | while read -r version; do
      [ -n "$version" ] || continue
      minor="$(echo "$version" | cut -d . -f 2)"
      v="$minor"
      while [ "$v" -ge 0 ]; do
        printf '%s\n' "$_python_archived" | grep -q "^3\.$v$" && break
        v=$((v - 1))
      done
      [ "$v" -ge 0 ] && printf './3.%s\n' "$v" || true
    done | sort -u | ( xargs -r -P 0 tar -xJf /usr/share/opentelemetry_shell/agent.instrumentation.python/python_site_packages.tar.xz -C /usr/share/opentelemetry_shell/agent.instrumentation.python/ || true )
    printf '%s\n' "$_python_versions" | while read -r version; do
      [ -n "$version" ] || continue
      minor="$(echo "$version" | cut -d . -f 2)"
      v="$minor"
      while [ "$v" -ge 0 ]; do
        printf '%s\n' "$_python_archived" | grep -q "^3\.$v$" && break
        v=$((v - 1))
      done
      [ "$v" -ge 0 ] && [ "3.$v" != "$version" ] && [ ! -d /usr/share/opentelemetry_shell/agent.instrumentation.python/"$version" ] && cp -r /usr/share/opentelemetry_shell/agent.instrumentation.python/3."$v" /usr/share/opentelemetry_shell/agent.instrumentation.python/"$version" || true
    done
    ls /usr/share/opentelemetry_shell/agent.instrumentation.python | grep -v '.txt$' | grep -v '.py$' | grep -v '.xz$' | grep -v 'Dockerfile$' | while read -r version; do
      venv="$(mktemp -u)"
      if ! type python"$version" || ! eval "python$version" -m venv "$venv"; then
        rm -rf /usr/share/opentelemetry_shell/agent.instrumentation.python/"$version"
        continue
      fi
      cp -r /usr/share/opentelemetry_shell/agent.instrumentation.python/"$version"/site-packages/* "$venv"/lib/python"$version"/site-packages/
      . "$venv"/bin/activate
      pip3 install -r /usr/share/opentelemetry_shell/agent.instrumentation.python/requirements.txt
      pip3 uninstall --yes pip setuptools
      deactivate # SKIP_DEPENDENCY_CHECK
      cp -r -u "$venv"/lib/python"$version"/site-packages/* /usr/share/opentelemetry_shell/agent.instrumentation.python/"$version"/site-packages/
      rm -rf "$venv"
    done
  fi 2>&1 | perl -0777 -pe '' >&2 &
  python3 -m venv /opt/opentelemetry_shell/venv && . /opt/opentelemetry_shell/venv/bin/activate && pip3 install -r /opt/opentelemetry_shell/requirements.txt && pip3 check && deactivate # SKIP_DEPENDENCY_CHECK
  cat /usr/share/opentelemetry_shell/*.py | grep -E '^import |^from ' | /opt/opentelemetry_shell/venv/bin/python3 # venv may be used by different users that may not be allowed to create pyc files
  wait
else
  exit 1
fi
