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

BASE_URL="https://python.coderdojohasselt.be"
OS=""

if [[ "$OSTYPE" == "darwin"* ]]; then
    OS="mac"
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
    OS="linux"
else
    echo "Dit besturingssysteem wordt niet ondersteund."
    echo "Gebruik Windows, macOS of Linux."
    exit 1
fi

echo "============================================="
echo " CoderDojo Python - Een-klik installatie"
echo "============================================="
echo ""
echo "Dit script installeert Python, uv, Thonny en alle game-bibliotheken."
echo "Het downloadt ook de startercode voor alle 10 sessies."
echo ""
echo "De installatie duurt 5-10 minuten, afhankelijk van je internet."
if [[ "$OS" == "mac" ]]; then
    echo "LET OP: macOS vraagt je wachtwoord voor Python installatie."
fi
echo ""

# ---------------------------------------------------------------
# Helper: download with retry
# ---------------------------------------------------------------
download() {
    local url="$1"
    local dest="$2"
    curl -L -f --retry 2 --retry-delay 5 -o "$dest" "$url"
}

# ---------------------------------------------------------------
# Kies installatiemap (optionele commandline parameter)
# ---------------------------------------------------------------
if [[ -n "${1:-}" ]]; then
    CODERDOJO_DIR="$1"
    CODERDOJO_DIR="${CODERDOJO_DIR/#\~/$HOME}"
    if [[ "$CODERDOJO_DIR" != /* ]]; then
        CODERDOJO_DIR="$PWD/$CODERDOJO_DIR"
    fi
    CODERDOJO_DIR="$(cd "$CODERDOJO_DIR" 2>/dev/null && pwd || echo "$CODERDOJO_DIR")"
    echo "Installatiemap: $CODERDOJO_DIR (via parameter)"
else
    DEFAULT_DIR="$HOME/Documents/cdj_python"

    echo "In welke map wil je CoderDojo installeren?"
    printf "Pad [$DEFAULT_DIR]: "
    read -r USER_DIR
    CODERDOJO_DIR="${USER_DIR:-$DEFAULT_DIR}"
    CODERDOJO_DIR="${CODERDOJO_DIR/#\~/$HOME}"
    if [[ "$CODERDOJO_DIR" != /* ]]; then
        CODERDOJO_DIR="$PWD/$CODERDOJO_DIR"
    fi
    CODERDOJO_DIR="$(cd "$CODERDOJO_DIR" 2>/dev/null && pwd || echo "$CODERDOJO_DIR")"
    echo ""
    echo "Installatiemap: $CODERDOJO_DIR"
    echo ""
    printf "Druk Enter om te beginnen, of Ctrl+C om te annuleren... "
    read -r
fi
echo ""

# ---------------------------------------------------------------
# Stap 1: Python 3.13
# ---------------------------------------------------------------
echo "[1/6] Python 3.13..."

if command -v python3.13 &>/dev/null; then
    echo "Python 3.13 gevonden - overslaan."
    PYTHON_CMD="python3.13"
elif command -v python3 &>/dev/null && python3 -c "import sys; sys.exit(0 if sys.version_info[:2] == (3,13) else 1)" 2>/dev/null; then
    echo "Python 3.13 gevonden - overslaan."
    PYTHON_CMD="python3"
else
    if [[ "$OS" == "mac" ]]; then
        echo "Python 3.13 downloaden en installeren..."
        download "https://www.python.org/ftp/python/3.13.14/python-3.13.14-macos11.pkg" "/tmp/python-3.13.pkg"
        sudo installer -pkg /tmp/python-3.13.pkg -target /
        rm -f /tmp/python-3.13.pkg
        PYTHON_CMD="/Library/Frameworks/Python.framework/Versions/3.13/bin/python3"
    else
        echo "Python 3.13 installeren via apt..."
        sudo apt-get update -qq
        if sudo apt-get install -y -qq python3.13 python3.13-venv python3.13-tk 2>/dev/null; then
            PYTHON_CMD="python3.13"
        else
            echo "Python 3.13 niet in standaard repositories."
            echo "Probeer deadsnakes PPA..."
            if ! command -v add-apt-repository &>/dev/null; then
                sudo apt-get install -y -qq software-properties-common
            fi
            sudo add-apt-repository -y ppa:deadsnakes/ppa
            sudo apt-get update -qq
            sudo apt-get install -y -qq python3.13 python3.13-venv python3.13-tk || {
                echo "Kon Python 3.13 niet installeren."
                echo "Probeer handmatig: https://www.python.org/downloads/"
                exit 1
            }
            PYTHON_CMD="python3.13"
        fi
    fi
    echo "Python 3.13 geinstalleerd."
fi

# ---------------------------------------------------------------
# Stap 2: uv
# ---------------------------------------------------------------
UV_BIN="$HOME/.cargo/bin/uv"
if [[ ! -x "$UV_BIN" ]]; then
    UV_BIN="$HOME/.local/bin/uv"
fi
echo "[2/6] uv..."

if command -v uv &>/dev/null; then
    echo "uv gevonden - overslaan."
    UV_CMD="uv"
elif [[ -x "$UV_BIN" ]]; then
    echo "uv gevonden - overslaan."
    UV_CMD="$UV_BIN"
else
    echo "uv installeren..."
    curl -LsSf https://astral.sh/uv/install.sh | sh || {
        echo "FOUT: Kon uv niet installeren."
        echo "Probeer handmatig: curl -LsSf https://astral.sh/uv/install.sh | sh"
        exit 1
    }
    UV_CMD="$UV_BIN"
    export PATH="$HOME/.cargo/bin:$PATH"
fi

# ---------------------------------------------------------------
# Stap 3: Project + virtuele omgeving
# ---------------------------------------------------------------
echo "[3/6] Project en virtuele omgeving..."

mkdir -p "$CODERDOJO_DIR"
cd "$CODERDOJO_DIR"

cat > pyproject.toml << 'PYPROJECT_EOF'
[project]
name = "coderdojo"
version = "0.1.0"
requires-python = ">=3.13,<3.14"
dependencies = ["pgzero", "pygame", "pillow"]
PYPROJECT_EOF

"$UV_CMD" sync --python "$PYTHON_CMD"
VENV_PYTHON="$CODERDOJO_DIR/.venv/bin/python"

# ---------------------------------------------------------------
# Stap 4: Thonny klaarmaken
# ---------------------------------------------------------------
echo "[4/6] Thonny..."

THONNY_CMD=""
if command -v thonny &>/dev/null; then
    THONNY_CMD="thonny"
elif [[ -x "/snap/bin/thonny" ]]; then
    THONNY_CMD="/snap/bin/thonny"
elif [[ -x "$HOME/.local/bin/thonny" ]]; then
    THONNY_CMD="$HOME/.local/bin/thonny"
elif [[ -x "/var/lib/flatpak/exports/bin/org.thonny.Thonny" ]]; then
    THONNY_CMD="flatpak run org.thonny.Thonny"
elif [[ -d "/Applications/Thonny.app" ]]; then
    THONNY_CMD="open /Applications/Thonny.app"
fi

if [[ -z "$THONNY_CMD" ]] && [[ "$OS" == "linux" ]]; then
    echo "Thonny installeren via apt..."
    if sudo apt-get install -y -qq thonny 2>/dev/null; then
        THONNY_CMD="thonny"
    elif command -v pip3 &>/dev/null; then
        echo "Thonny niet via apt, probeer pip..."
        pip3 install --user thonny && THONNY_CMD="$HOME/.local/bin/thonny"
    fi
fi

if [[ -z "$THONNY_CMD" ]]; then
    echo ""
    echo "============================================="
    echo " Thonny is niet geinstalleerd!"
    echo ""
    echo " Open https://thonny.org in je browser"
    echo " en download Thonny voor jouw systeem."
    echo ""
    echo " Installeer Thonny en start dit script opnieuw."
    echo "============================================="
    if command -v xdg-open &>/dev/null; then
        xdg-open "https://thonny.org" 2>/dev/null &
    elif command -v open &>/dev/null; then
        open "https://thonny.org" 2>/dev/null &
    fi
    exit 1
fi

echo "Thonny gevonden - overslaan."

# ---------------------------------------------------------------
# Stap 5: Startercode downloaden
# ---------------------------------------------------------------
echo "[5/6] Startercode downloaden..."

SESSIONS=(
    "01-catch-the-stars"
    "02-dodge-meteors"
    "03-space-blaster"
    "04-pong"
    "05-breakout"
    "06-platformer"
    "07-bug-zapper"
    "08-sky-highway"
    "09-boss-battle"
    "10-my-game"
)

for SESSION in "${SESSIONS[@]}"; do
    SESSION_DIR="$CODERDOJO_DIR/$SESSION"
    if [[ -d "$SESSION_DIR" ]]; then
        echo "  $SESSION al aanwezig - overslaan."
    else
        echo "  $SESSION downloaden..."
        ZIP_URL="$BASE_URL/sessions/$SESSION/starter.zip"
        if download "$ZIP_URL" "/tmp/$SESSION.zip"; then
            mkdir -p "$SESSION_DIR"
            unzip -qo "/tmp/$SESSION.zip" -d "$SESSION_DIR"
            rm -f "/tmp/$SESSION.zip"
        else
            echo "  $SESSION nog niet beschikbaar - overslaan."
        fi
    fi
done
echo "Startercode gedownload naar $CODERDOJO_DIR"

# ---------------------------------------------------------------
# Stap 6: Thonny configureren en openen
# ---------------------------------------------------------------
echo "[6/6] Thonny configureren en openen..."

if [[ "$OS" == "mac" ]]; then
    THONNY_CONFIG="$HOME/Library/Thonny/configuration.ini"
elif [[ "$THONNY_CMD" == "/snap/bin/thonny" ]]; then
    THONNY_CONFIG="$HOME/snap/thonny/current/.config/Thonny/configuration.ini"
else
    THONNY_CONFIG="$HOME/.config/Thonny/configuration.ini"
fi

mkdir -p "$(dirname "$THONNY_CONFIG")"

SESSION1_DIR="$CODERDOJO_DIR/01-catch-the-stars"
if [[ ! -d "$SESSION1_DIR" ]]; then
    SESSION1_DIR="$CODERDOJO_DIR"
fi

cat > "$THONNY_CONFIG" << THONNYEOF
[run]
interpreter = $VENV_PYTHON
backend_name = LocalCPython
working_directory = $SESSION1_DIR

[LocalCPython]
executable = $VENV_PYTHON

[view]
FilesView.visible = True
THONNYEOF

cd "$SESSION1_DIR"
$THONNY_CMD &>/dev/null &
echo "Thonny gestart in $SESSION1_DIR"

# ---------------------------------------------------------------
# Klaar
# ---------------------------------------------------------------
echo ""
echo "============================================="
echo " Installatie voltooid!"
echo ""
echo " Thonny opent in les 1 (01-catch-the-stars)."
echo " De virtuele omgeving is ingesteld als interpreter."
echo " Open main.py en klik de groene Play-knop."
echo ""
echo " Je kunt ook de terminal gebruiken:"
echo " cd $CODERDOJO_DIR/01-catch-the-stars"
echo " uv run main.py"
echo ""
echo " Veel plezier op de CoderDojo!"
echo "============================================="
