name: CI

env:
  PYTHON_VERSION: '3.12.0'

on:
  push:
    branches:
      - master
      - '*.x'
  pull_request:
    branches:
      - master
      - '*.x'

jobs:
  setup:
    runs-on: ubuntu-22.04
    defaults:
      run:
        shell: bash

    steps:
      - uses: actions/checkout@v3

      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: ${{ env.PYTHON_VERSION }}

      - name: Pick Indico core repo
        env:
          GH_TOKEN: ${{ github.token }}
          PR_BODY: ${{ github.event_name == 'pull_request' && github.event.pull_request.body }}
          PR_BASE_REF: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.ref }}
        run: python .github/utils/get_core_repo.py indico/indico INDICO

      - name: Install system dependencies
        run: sudo apt-get install postgresql-client libpq-dev

      - name: Create virtualenv
        run: |
          python3.12 -m venv .venv
          source .venv/bin/activate
          pip install -U pip setuptools wheel

      - name: Activate virtualenv for later steps
        run: |
          echo "VIRTUAL_ENV=$(pwd)/.venv" >> $GITHUB_ENV
          echo "$(pwd)/.venv/bin" >> $GITHUB_PATH

      - name: Get pip cache dir
        id: pip-cache
        run: echo "dir=$(pip cache dir)" >> $GITHUB_OUTPUT

      - name: Cache pip
        id: cache-pip
        uses: actions/cache@v3
        with:
          path: ${{ steps.pip-cache.outputs.dir }}
          key: pip|${{ runner.os }}|3.12|${{ hashFiles('**/setup.cfg') }}

      - uses: actions/cache@v3
        id: cache-npm
        with:
          path: node_modules
          key: ${{ runner.os }}-npm-${{ hashFiles('package*.json') }}

      - name: Setup Node
        uses: actions/setup-node@v3
        if: steps.cache-npm.outputs.cache-hit != 'true'
        with:
          node-version: '18.x'

      - name: Install Indico
        run: |
          pip install Babel
          pip install "indico[dev] @ git+https://github.com/${INDICO_REPO}.git@${INDICO_BRANCH}"

      - name: Install node dependencies
        if: steps.cache-npm.outputs.cache-hit != 'true'
        run: npm ci

      - name: Archive environment
        run: tar cf /tmp/env.tar .venv node_modules

      - name: Upload environment
        uses: actions/upload-artifact@v3
        with:
          name: environment
          retention-days: 1
          path: /tmp/env.tar

  lint:
    needs: setup
    runs-on: ubuntu-22.04

    defaults:
      run:
        shell: bash

    steps:
      - uses: actions/checkout@v3

      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: ${{ env.PYTHON_VERSION }}

      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: '18.x'

      - name: Download environment
        uses: actions/download-artifact@v3
        with:
          name: environment
          path: /tmp

      - name: Restore environment
        run: tar xf /tmp/env.tar

      - name: Activate virtualenv for later steps
        run: |
          echo "VIRTUAL_ENV=$(pwd)/.venv" >> $GITHUB_ENV
          echo "$(pwd)/.venv/bin" >> $GITHUB_PATH

      - name: Check import sorting
        run: isort --diff --check-only .

      - name: Check headers
        if: success() || failure()
        run: |
          echo '::add-matcher::.github/matchers/headers-problem-matcher.json'
          unbehead --check
          echo '::remove-matcher owner=headers::'

      - name: Run flake8
        if: success() || failure()
        run: |
          echo '::add-matcher::.github/matchers/flake8-problem-matcher.json'
          flake8 --format '%(path)s:%(row)d:%(col)d: %(code)s %(text)s'
          echo '::remove-matcher owner=flake8::'

  test-plugin:
    needs: setup
    runs-on: ubuntu-22.04

    defaults:
      run:
        shell: bash

    services:
      postgres:
        image: postgres:11
        env:
          POSTGRES_HOST_AUTH_METHOD: trust
        ports:
          - 5432
        options: --health-cmd pg_isready --health-interval 5s --health-timeout 5s --health-retries 10

    strategy:
      matrix:
        include:
          - plugin: citadel
          - plugin: livesync
          - plugin: payment_paypal
          - plugin: storage_s3
          - plugin: vc_zoom
          - plugin: prometheus

    steps:
      - uses: actions/checkout@v3

      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: ${{ env.PYTHON_VERSION }}

      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: '18.x'

      - name: Download environment
        uses: actions/download-artifact@v3
        with:
          name: environment
          path: /tmp

      - name: Restore environment
        run: tar xf /tmp/env.tar

      - name: Activate virtualenv for later steps
        run: |
          echo "VIRTUAL_ENV=$(pwd)/.venv" >> $GITHUB_ENV
          echo "$(pwd)/.venv/bin" >> $GITHUB_PATH

      - name: Install extra dependencies
        if: matrix.plugin == 'citadel' || matrix.plugin == 'prometheus'
        run: |
          pip install -e "${GITHUB_WORKSPACE}/livesync/"

      - name: Install plugin
        run: |
          cd "${GITHUB_WORKSPACE}/${{ matrix.plugin }}"
          pip install -e .

      - name: Install redis
        run: sudo apt-get install redis-server

      - name: Setup database
        run: |
          export PGHOST=localhost
          export PGPORT=${{ job.services.postgres.ports[5432] }}
          export PGUSER=postgres
          createuser indicotest
          createdb -O indicotest indicotest
          psql indicotest -c 'CREATE EXTENSION unaccent;'
          psql indicotest -c 'CREATE EXTENSION pg_trgm;'

      - name: Run tests
        run: |
          export INDICO_TEST_DATABASE_URI="postgresql://indicotest@localhost:${{ job.services.postgres.ports[5432] }}/indicotest"
          cd "${GITHUB_WORKSPACE}/${{ matrix.plugin }}"
          pytest --color=yes
