name: Tests and Linting

on:
  workflow_dispatch:
  pull_request:
  push:
    branches: [master]

env:
  UV_INDEX_STRATEGY: "unsafe-first-match"
  UV_EXTRA_INDEX_URL: "https://download.pytorch.org/whl/cpu"
  PIP_EXTRA_INDEX_URL: "https://download.pytorch.org/whl/cpu"
  UV_SYSTEM_PYTHON: 1
  BRANCH_NAME: ${{ github.head_ref || github.ref_name }}

jobs:
  linting:
    name: Linting
    if: github.event_name == 'pull_request'
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v3
        with:
          # requites to grab the history of the PR
          fetch-depth: 0

      - uses: actions/setup-python@v5
        with:
          cache: 'pip'

      - uses: pre-commit/action@v3.0.0
        with:
          extra_args: --color=always --from-ref ${{ github.event.pull_request.base.sha }} --to-ref ${{ github.event.pull_request.head.sha }}

  pytest:
    name: Pytest
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: true
      matrix:
        python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
    steps:
      - uses: actions/checkout@v2

      - name: Cache downloaded resources
        uses: actions/cache@v3
        with:
          path: ~/.data/
          key: resources

      - name: Set up Java
        uses: actions/setup-java@v2
        with:
          distribution: "temurin" # See 'Supported distributions' for available options
          java-version: "8"

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
          cache: 'pip'

      - name: Install dependencies
        run: pip install -e ".[dev]"
        if: matrix.python-version != '3.9' && matrix.python-version != '3.10' && matrix.python-version != '3.11' && matrix.python-version != '3.12'

      - name: Install dependencies
        run: pip install -e ".[dev,setup]"
        if: matrix.python-version == '3.9'

      - name: Install dependencies
        # skip ML tests for 3.10 and 3.11
        run: pip install -e ".[dev-no-ml]"
        if: matrix.python-version == '3.10' || matrix.python-version == '3.11' || matrix.python-version == '3.12'

      - name: Test with Pytest on Python ${{ matrix.python-version }}
        env:
          UMLS_API_KEY: ${{ secrets.UMLS_API_KEY }}
        run: coverage run -m pytest --ignore tests/test_docs.py
        if: matrix.python-version != '3.9'

      - name: Test with Pytest on Python ${{ matrix.python-version }}
        env:
          UMLS_API_KEY: ${{ secrets.UMLS_API_KEY }}
        run: coverage run -m pytest
        if: matrix.python-version == '3.9'

      - name: Upload coverage data
        uses: actions/upload-artifact@v4
        with:
          name: coverage-data-${{ matrix.python-version }}
          path: .coverage.*
          if-no-files-found: ignore
          include-hidden-files: true

  coverage:
    name: Coverage
    needs: pytest
    uses: aphp/foldedtensor/.github/workflows/coverage.yml@main
    with:
      base-branch: master
      coverage-data-pattern: coverage-data-*
      coverage-report: coverage.txt
      coverage-badge: coverage.svg
      coverage-branch: coverage

  documentation:
    name: Documentation
    runs-on: ubuntu-latest
    # Main docs are built in another workflow, we don't have to test them outside of PR
    if: github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
    steps:
    - uses: actions/checkout@v2

    - uses: actions/setup-python@v5
      with:
        python-version: 3.9
        cache: 'pip'

    - name: Install dependencies
      run: pip install -e ".[docs]"

    - name: Set up Git
      run: |
        git config user.name ${{ github.actor }}
        git config user.email ${{ github.actor }}@users.noreply.github.com
        echo Current branch: $BRANCH_NAME

    - name: Build documentation
      run: |
        mike deploy --no-redirect --rebase --update-aliases $BRANCH_NAME latest
        mike set-default $BRANCH_NAME

    - name: Put content of gh-pages to public folder
      run: rm -rf public && mkdir public && git archive gh-pages | tar -x -C ./public/

    - name: Set up Vercel
      run: npm install --global vercel@latest

    - name: Pull Vercel environment
      run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }}

    - name: Create new vercel project linked to this branch
      run: vercel project add edsnlp-$BRANCH_NAME --token=${{ secrets.VERCEL_TOKEN }}

    - name: Link public folder to the (maybe) new vercel project
      run: vercel link --cwd public --project edsnlp-$BRANCH_NAME --yes --token=${{ secrets.VERCEL_TOKEN }}

    - name: Deploy to Vercel
      run: vercel deploy public/ --yes --token=${{ secrets.VERCEL_TOKEN }} --archive=tgz --prod > deployment-url.txt

    - name: Post the documentation link
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        slugify () {
            echo "$1" | iconv -c -t ascii//TRANSLIT | sed -E 's/[^a-zA-Z0-9-]+//g' | tr A-Z a-z
        }
        RAW_PROJECT_NAME="edsnlp-$BRANCH_NAME"
        URL=https://$(slugify "$RAW_PROJECT_NAME").vercel.app/
        COMMENT_BODY="## Docs preview URL\n\n$URL\n\n"
        HEADER="Authorization: token $GITHUB_TOKEN"
        PR_COMMENTS_URL="https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments"

        # Fetch existing comments to find if one from this workflow already exists
        COMMENTS=$(curl -s -H "$HEADER" "$PR_COMMENTS_URL")
        COMMENT_ID=$(echo "$COMMENTS" | jq -r '.[] | select(.user.login == "github-actions[bot]" and (.body | startswith("## Docs preview URL"))) | .id')

        # Check if we have a comment ID, if so, update it, otherwise create a new one
        if [[ "$COMMENT_ID" ]]; then
          # Update existing comment
          curl -s -X PATCH -H "$HEADER" -H "Content-Type: application/json" -d "{\"body\": \"$COMMENT_BODY\"}" "https://api.github.com/repos/${{ github.repository }}/issues/comments/$COMMENT_ID"
        else
          # Post new comment
          curl -s -X POST -H "$HEADER" -H "Content-Type: application/json" -d "{\"body\": \"$COMMENT_BODY\"}" "$PR_COMMENTS_URL"
        fi

        if [ $status -ne 0 ]; then
          exit $status
        fi

  simple-installation:
    name: Simple installation
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: true
      matrix:
        python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
    steps:
      - uses: actions/checkout@v2

      - uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
          cache: 'pip'

      - run: echo WEEK=$(date +%V) >>$GITHUB_ENV
        shell: bash

      - name: Install library
        run: |
          pip install ".[ml]" pytest
          pytest tests/pipelines/test_pipelines.py
