# Runner / installer / updater for puppy v2.

#!/usr/bin/bash

DEFAULT_PY_VERSION=3.13
GH_BRANCH=main
GH_URL=https://raw.githubusercontent.com/liquidcarbon/puppy/"$GH_BRANCH"/
PIXI_INSTALL_URL=https://pixi.sh/install.sh

main() {
  DIR=$(pwd)
  PUP=""
  while [ "$DIR" != "/" ]; do
    if [ -f "$DIR/pixi.toml" ]; then
        PIXI_TOML="$DIR/pixi.toml"
    fi
    if [ -f "$DIR/pup.py" ]; then
      PUP="$DIR/pup.py"
      PUP_HOME="$DIR"
      break
    fi
    DIR=$(dirname "$DIR")
  done

  if [ "$PUP" != "" ] && [ "$1" != "update" ]; then
    run "$@"
  elif [ -f "$PUP" ] && [ "$1" == "update" ]; then
    update
  else
    install "$@"
  fi
}

run() {
  PY="$PUP_HOME"/.pixi/envs/default/bin/python
  if [ -e "$PY" ]; then
    "$PY" "$PUP" "$@"
  else
    if ! pixi run python "$PUP" "$@"; then
      install "$@"
    fi
  fi
}


update() {
  get_pixi
  pixi self-update
  pixi_init
  get_python_uv_click
  pixi update
  get_pup
}


install() {
  if [ "$(ls -A)" != "" ]; then
    read -ei "y" -p \
      "$(pwd) is not empty; do you want to make it puppy's home? (y/n): "
      if [ "$REPLY" == "n" ]; then
        exit 1
      fi
  fi
  get_pixi
  pixi_init
  get_python_uv_click "$1"
  get_pup
}


get_pixi() {
  if ! command -v pixi &> /dev/null; then
    curl -fsSL $PIXI_INSTALL_URL | bash
    export PATH=$HOME/.pixi/bin:$PATH  # new installs & GHA need this
    echo "✨ $(pixi -V) installed"
  else
    echo "✨ $(pixi -V) found"
  fi
  PIXI_HOME=$(dirname $(command -v pixi))
}


pixi_init() {
  if [ -f "$PUP_HOME/pixi.toml" ]; then
    echo "✨ here be pixies! pixi.toml found"
  else
    pixi init .
  fi
}


py_ver_prompt() {
  if [ -t 0 ]; then
    read -ei "$DEFAULT_PY_VERSION" -p "$(cat <<-EOF
Enter desired base Python version
(supported: 3.9|3.10|3.11|3.12|3.13; blank=3.12):$(printf '\u00A0')
EOF
)" PY_VERSION
  else
    PY_VERSION="$DEFAULT_PY_VERSION"
  fi
}


get_python_uv_click() {
  if [ -n "$1" ]; then
    # if a version is passed as argument, update/reinstall
    PY_VERSION="$1"
    INSTALL=1
  else
    if grep -q python "$PUP_HOME/pixi.toml" &> /dev/null; then
      INSTALL=0
    else
      # no argument and no python? prompt w/default for non-interactive shell & install
      py_ver_prompt
      INSTALL=1
    fi
  fi
  if [ $INSTALL -eq 1 ]; then
    pixi add python${PY_VERSION:+=$PY_VERSION}
    pixi add "uv>=0" && echo "🟣 $(pixi run uv --version)"
    pixi add "click>=8"
    # using ">=" overrides pixi's default ">=,<" and allows updates to new major versions
  else
    echo "🐍 python lives here!"
  fi
  pixi run python -VV
  # PYTHON_EXECUTABLE=$(pixi run python -c 'import sys; print(sys.executable)')
}


get_pup() {
  if [ -n $PUP ] && [ -f "$PUP" ]; then
    curl -fsSL "$GH_URL/pup.py" -o "$PUP" && chmod +x "$PUP"
  else
    curl -fsSL "$GH_URL/pup.py" -o pup.py && chmod +x pup.py
  fi
  curl -fsSL "$GH_URL/pup.sh" -o "$PIXI_HOME/pup"
  chmod +x "$PIXI_HOME/pup"
  "$PIXI_HOME/pup" hi
}


main "$@"
