name: Check for latest JupyterLab releases

on:
  # schedule:
  #   - cron: 30 17 * * *
  workflow_dispatch:
    inputs:
      version:
        description: 'JupyterLab version'
        default: latest
        required: true
        type: string
      branch:
        description: 'The branch to target'
        default: main
        required: false
        type: string
      target_repo:
        description: 'Target repository'
        required: false
        default: jupyter/notebook
        type: string

env:
  version_tag: 'latest'

permissions:
  actions: write
  contents: write
  pull-requests: write

jobs:
  check_for_lab_updates:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          ref: ${{ inputs.branch || 'main' }}

      - name: Set up Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.11'

      - name: Install Node
        uses: actions/setup-node@v6
        with:
          node-version: '20.x'

      - name: Install npm dependencies and build buildutils
        run: |
          python -m pip install -e ".[dev]"

          jlpm
          jlpm run build:utils

      - name: Check for new releases and update
        shell: bash
        run: |
          set -eux
          for version in ${{ inputs.version || env.version_tag }}
          do
            if [[ "${version}" == "latest" ]]; then
              export LATEST=$(jlpm run get:lab:version --set-version ${version})
            else
              export LATEST=${version}
            fi
          done

          echo "latest=${LATEST}" >> $GITHUB_ENV
          jlpm upgrade:lab:dependencies --set-version ${LATEST}
          if [[ ! -z "$(git status --porcelain package.json)" ]]; then
            jlpm
            jlpm deduplicate

            cd ui-tests
            jlpm
            jlpm deduplicate
          fi
      - uses: prefix-dev/setup-pixi@v0.9.3
        with:
          pixi-version: v0.41.4
          manifest-path: pyproject.toml
          locked: false

      - name: Update pixi.lock
        run: pixi install

      - name: Create a PR
        env:
          GITHUB_TOKEN: ${{ secrets.PERSONAL_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
        run: |
          set -eux

          export LATEST=${{ env.latest }}
          export BRANCH_NAME=update-to-v${LATEST}

          # if resulted in any change:
          if [[ ! -z "$(git status --porcelain package.json)" ]]; then
            # if branch already exists.
            if git ls-remote --heads origin | grep "refs/heads/${BRANCH_NAME}$" > /dev/null; then
              echo "Branch '${BRANCH_NAME}' exists."
            else
              # new branch is created
              git checkout -b "${BRANCH_NAME}"
              git config user.name "github-actions[bot]"
              git config user.email 'github-actions[bot]@users.noreply.github.com'

              git commit . -m "Update to JupyterLab v${LATEST}"

              git push --set-upstream origin "${BRANCH_NAME}"

              PR_ARGS=(
                --base "${{ inputs.branch || 'main' }}"
                --title "Update to JupyterLab v${LATEST}"
                --body "New JupyterLab release [v${LATEST}](https://github.com/jupyterlab/jupyterlab/releases/tag/v${LATEST}) is available. Please review the lock file carefully."
              )

              # Add --repo flag only if target_repo is specified
              if [[ -n "${{ inputs.target_repo }}" ]]; then
                PR_ARGS+=(--repo "${{ inputs.target_repo }}")
              fi

              gh pr create "${PR_ARGS[@]}"
            fi
          fi
