# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python

# Inspired from https://pytest-qt.readthedocs.io/en/latest/troubleshooting.html#github-actions

name: Install and Test on Ubuntu (latest)

on:
  push:
    branches: [ "main", "develop", "release" ]
  pull_request:
    branches: [ "main", "develop", "release" ]
  workflow_dispatch:
    inputs:
      job_to_run:
        description: 'Which job to run'
        required: true
        type: choice
        options:
          - 'all'
          - 'build'
          - 'build_latest'
        default: 'all'
  schedule:
    # Only the "build_latest" job runs on schedule (see execution conditions below)
    - cron: "0 5 * * 1"

jobs:
  build:
    if: ${{ (github.event_name == 'push' || github.event_name == 'pull_request') || (github.event_name == 'workflow_dispatch' && (github.event.inputs.job_to_run == 'all' || github.event.inputs.job_to_run == 'build')) }}

    env:
      DISPLAY: ':99.0'

    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.9", "3.13"]

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies
      run: |
        sudo apt install libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xfixes0 x11-utils
        /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -screen 0 1920x1200x24 -ac +extension GLX
        python -m pip install --upgrade pip
        python -m pip install ruff pytest
        if [ "${{ github.ref_name }}" = "develop" ]; then
           pip uninstall -y guidata
           cd ..
           git clone --depth 1 --branch develop https://github.com/PlotPyStack/guidata.git
           cd Sigima
           pip install -e ../guidata
           # Install tomli for TOML parsing (safe if already present)
           pip install tomli
           # Extract dependencies and save to file, then install
           python -c "import tomli; f=open('pyproject.toml','rb'); data=tomli.load(f); deps=[d for d in data['project']['dependencies'] if not any(p in d for p in ['guidata'])]; open('deps.txt','w').write('\n'.join(deps))"
           pip install -r deps.txt
           # Install Sigima without dependencies
           pip install --no-deps .
        elif [ "${{ github.ref_name }}" = "release" ]; then
           pip uninstall -y guidata
           cd ..
           # Try cloning guidata from release, fallback to main or master
           git clone --depth 1 --branch release https://github.com/PlotPyStack/guidata.git || git clone --depth 1 https://github.com/PlotPyStack/guidata.git || git clone --depth 1 --branch master https://github.com/PlotPyStack/guidata.git
           cd Sigima
           pip install -e ../guidata
           # Install tomli for TOML parsing (safe if already present)
           pip install tomli
           # Extract dependencies and save to file, then install
           python -c "import tomli; f=open('pyproject.toml','rb'); data=tomli.load(f); deps=[d for d in data['project']['dependencies'] if not any(p in d for p in ['guidata'])]; open('deps.txt','w').write('\n'.join(deps))"
           pip install -r deps.txt
           # Install Sigima without dependencies
           pip install --no-deps .
        else
           # Install from PyPI normally for main branch
           pip install .
        fi
    - name: Lint with Ruff
      run: ruff check --output-format=github sigima
    - name: Test with pytest
      run: pytest -v --tb=long

  build_latest:
    if: ${{ github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && (github.event.inputs.job_to_run == 'all' || github.event.inputs.job_to_run == 'build_latest')) }}
    env:
      DISPLAY: ':99.0'
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4

    - name: Set up Python 3.13
      uses: actions/setup-python@v5
      with:
        python-version: "3.13"

    - name: Install dependencies (latest)
      run: |
        set -euxo pipefail
        sudo apt-get update
        sudo apt-get install -y \
          libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 \
          libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xfixes0 x11-utils

        /sbin/start-stop-daemon --start --quiet \
          --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background \
          --exec /usr/bin/Xvfb -- :99 -screen 0 1920x1200x24 -ac +extension GLX

        python -m pip install --upgrade pip
        python -m pip install ruff pytest

        # Install Sigima itself, but do NOT install its pinned deps
        python -m pip install -e . --no-deps

        # Extract dependency names from pyproject.toml and install latest versions
        python -m pip install -U --upgrade-strategy eager $(python -c "import tomllib, re; print(' '.join(re.sub(r'[\[\]<>=!~,.\s].*$', '', d).strip() for d in tomllib.loads(open('pyproject.toml', 'rb').read().decode())['project']['dependencies']))")

    - name: Lint with Ruff (latest)
      run: ruff check --output-format=github sigima

    - name: Test with pytest (latest)
      run: pytest -v --tb=long
