name: Snapshot release

on:
  push:
    branches:
      - 'master'
      - '4.0'
    paths-ignore:
      - 'docs/**'
  release:
    types: [created]

jobs:
  prepare_ui_test_matrix:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.ref }}
          repository: ${{ github.event.pull_request.head.repo.full_name }}
      - name: Setup Node
        uses: actions/setup-node@v3.2.0
        with:
          node-version: '12'
      - id: set-matrix
        run: npm install --save glob && node main/tests/cypress/build-test-matrix.js
        env:
          browsers: chrome
  ui_test:
    needs: prepare_ui_test_matrix
    runs-on: ubuntu-latest
    strategy:
      matrix: ${{fromJSON(needs.prepare_ui_test_matrix.outputs.matrix)}}
    steps:
      - uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.ref }}
          repository: ${{ github.event.pull_request.head.repo.full_name }}

      - name: Set up secrets
        run: |
          echo "CYPRESS_RECORD_KEY=$(echo YzE3ZDU4OGItZTBkOC00ZjJmLTg4NjYtNzJmNmFmYmRhNGQxCg== | base64 -d)" >> $GITHUB_ENV
          echo "CYPRESS_PROJECT_ID=s5du3k" >> $GITHUB_ENV

      - name: Restore dependency cache
        uses: actions/cache@v3
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Set up Java 11
        uses: actions/setup-java@v3
        with:
          distribution: 'adopt'
          java-version: 11

      - name: Build OpenRefine
        run: ./refine build

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

      - name: Restore Tests dependency cache
        uses: actions/cache@v3
        with:
          path: |
            ~/cache
            ~/.cache
            **/node_modules
            !~/cache/exclude
          key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn

      - name: Install test dependencies
        run: |
          cd ./main/tests/cypress
          npm i -g yarn
          yarn install

      - name: Test with Cypress on ${{ matrix.browser }}
        run: | 
          echo REFINE_MIN_MEMORY=1400M >> ./refine.ini
          echo REFINE_MEMORY=4096M >> ./refine.ini
          ./refine ui_tests
        env:
          CYPRESS_BROWSER: ${{ matrix.browser }}
          CYPRESS_RECORD_KEY: ${{ env.CYPRESS_RECORD_KEY }}
          CYPRESS_PROJECT_ID: ${{ env.CYPRESS_PROJECT_ID }}
          CYPRESS_CI_BUILD_ID: '${{ github.run_id }}'
          CYPRESS_SPECS: ${{ matrix.specs }}


  build:

    services:
      postgres:
        image: postgres
        ports:
          - 5432
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: 'postgres'
          POSTGRES_DB: test_db
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
      mysql:
        image: mysql:8
        ports:
          - 3306
        env:
          MYSQL_ROOT_PASSWORD: root
        options: >-
          --health-cmd "mysqladmin ping"
          --health-interval 5s
          --health-timeout 2s
          --health-retries 3

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
      with:
        fetch-depth: 0 # This is wasteful, but needed for git describe

    - name: Set up secrets
      run: |
        echo "COVERALLS_TOKEN=$(echo eUVUVGRHOFJhQm9GMFJBYTNibjVhcWFEblpac1lmMlE3Cg== | base64 -d)" >> $GITHUB_ENV

    - name: Restore dependency cache
      uses: actions/cache@v3
      with:
        path: ~/.m2/repository
        key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
        restore-keys: |
            ${{ runner.os }}-maven-

    - name: Set up Java 11
      uses: actions/setup-java@v3
      with:
        distribution: 'adopt'
        java-version: 11
        server-id: ossrh
        server-username: OSSRH_USER
        server-password: OSSRH_PASS

    - name: Install genisoimage and jq
      run: sudo apt-get install genisoimage jq

    - name: Configure connections to databases
      id: configure_db_connections
      run: cat extensions/database/tests/conf/github_actions_tests.xml | sed -e "s/MYSQL_PORT/${{ job.services.mysql.ports[3306] }}/g" | sed -e "s/POSTGRES_PORT/${{ job.services.postgres.ports[5432] }}/g" > extensions/database/tests/conf/tests.xml

    - name: Populate databases with test data
      id: populate_databases_with_test_data
      run: |
        mysql -u root -h 127.0.0.1 -P ${{ job.services.mysql.ports[3306] }} -proot -e 'CREATE DATABASE test_db;'
        mysql -u root -h 127.0.0.1 -P ${{ job.services.mysql.ports[3306] }} -proot < extensions/database/tests/conf/test-mysql.sql
        psql -U postgres test_db -h 127.0.0.1 -p ${{ job.services.postgres.ports[5432] }} < extensions/database/tests/conf/test-pgsql.sql
      env:
        PGPASSWORD: postgres

    - name: Install webapp dependencies
      run: cd main/webapp && npm install
      
    - name: Build and test with Maven
      run: mvn jacoco:prepare-agent test

    - name: Submit test coverage to Coveralls
      run: |
        mvn jacoco:report coveralls:report -DrepoToken=${{ env.COVERALLS_TOKEN }} -DpullRequest=${{ github.event.number }} -DserviceName="GitHub Actions" -DserviceBuildNumber=${{ env.GITHUB_RUN_ID }} -Dbranch=master

    - name: Install webapp dependencies
      run: cd main/webapp && npm install

    - name: Generate dist files
      run: mvn package -DskipTests=true

  mac_test_and_deploy:
    runs-on: macos-latest

    steps:
    - uses: actions/checkout@v3

    - name: Restore dependency cache
      uses: actions/cache@v3
      with:
        path: ~/.m2/repository
        key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
        restore-keys: |
            ${{ runner.os }}-maven-

    - name: Set up Java 17
      uses: actions/setup-java@v3
      with:
        distribution: 'adopt'
        java-version: 17
        server-id: ossrh
        server-username: OSSRH_USER
        server-password: OSSRH_PASS
        gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
        gpg-passphrase: GPG_PASSPHRASE

    - name: Decrypt Apple certificates
      run: |
        gpg --pinentry-mode loopback --passphrase "${{ secrets.GPG_PASSPHRASE }}" --output .github/workflows/release/apple_cert.cer --decrypt packaging/apple_certs/apple_cert.cer.enc
        gpg --pinentry-mode loopback --passphrase "${{ secrets.GPG_PASSPHRASE }}" --output .github/workflows/release/apple_cert.p12 --decrypt packaging/apple_certs/apple_cert.p12.enc
        .github/workflows/release/add_apple_keys.sh
      env:
        P12_PASSPHRASE: ${{ secrets.APPLE_P12_PASSPHRASE }}

    - name: Apply patch to insert Google API credentials
      run: |
        gpg --pinentry-mode loopback --passphrase "${{ secrets.GPG_PASSPHRASE }}" --output .github/workflows/release/gdata.patch --decrypt .github/workflows/release/gdata.patch.asc
        git am .github/workflows/release/gdata.patch
        git reset HEAD^

    - name: Install webapp dependencies
      run: cd main/webapp && npm install
      
    - name: Build, test and package
      run: mvn package -Dapple.notarization.username=$APPLE_USERNAME -Dapple.notarization.password=$APPLE_PASSWORD -Dapple.notarization.team.id=$APPLE_TEAM_ID
      env:
        GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
        APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
        APPLE_USERNAME: ${{ secrets.APPLE_USERNAME }}
        APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}

    - name: Upload snapshot releases to OSSRH
      run: |
        if [ ${{ github.event_name }} == release ]; then
          echo "Deploying to releases"
          mvn deploy -DskipTests=true -DrepositoryId=ossrh
        else
          echo "Deploying to snapshots"
          mvn deploy -DskipTests=true -DrepositoryId=ossrh
        fi
      env:
        OSSRH_USER: ${{ secrets.OSSRH_USER }}
        OSSRH_PASS: ${{ secrets.OSSRH_PASS }}
        GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}

