name: Preview build

on:
  repository_dispatch:
    types:
    - Preview*

jobs:
  preview:
    name: Build preview

    runs-on: ubuntu-20.04
    container:
      # If you change this version, change the number in the cache step too.
      image: emscripten/emsdk:3.1.28

    steps:
    - name: Update deployment status to in progress
      uses: octokit/request-action@v2.x
      with:
        route: POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses
        mediaType: |
          previews:
          - ant-man
          - flash
        owner: ${{ github.event.repository.owner.login }}
        repo: ${{ github.event.repository.name }}
        deployment_id: ${{ github.event.client_payload.deployment_id }}
        state: in_progress
      env:
        GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }}

    - name: Checkout
      uses: actions/checkout@v3
      with:
        ref: ${{ github.event.client_payload.sha }}

    - name: Name branch
      run: |
        name=$(echo "${{ github.event.client_payload.folder }}")
        git checkout -b ${name}

    - name: Setup cache
      uses: actions/cache@v3
      with:
        path: /emsdk/upstream/emscripten/cache
        key: 3.1.28-${{ runner.os }}

    - name: Patch Emscripten to support LZMA
      run: |
        cd /emsdk/upstream/emscripten
        patch -p1 < ${GITHUB_WORKSPACE}/os/emscripten/emsdk-liblzma.patch

    - name: Build (host tools)
      run: |
        mkdir build-host
        cd build-host

        echo "::group::CMake"
        cmake .. -DOPTION_TOOLS_ONLY=ON
        echo "::endgroup::"

        echo "::group::Build"
        echo "Running on $(nproc) cores"
        make -j$(nproc) tools
        echo "::endgroup::"

    - name: Install GCC problem matcher
      uses: ammaraskar/gcc-problem-matcher@master

    - name: Build
      run: |
        mkdir build
        cd build

        echo "::group::CMake"
        emcmake cmake .. \
          -DHOST_BINARY_DIR=../build-host \
          -DCMAKE_BUILD_TYPE=Release \
          # EOF
        echo "::endgroup::"

        echo "::group::Build"
        echo "Running on $(nproc) cores"
        emmake make -j$(nproc)
        echo "::endgroup::"

    - name: Publish preview
      run: |
        pip3 install awscli

        aws s3 cp --only-show-errors build/openttd.data s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/
        aws s3 cp --only-show-errors build/openttd.html s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/
        aws s3 cp --only-show-errors build/openttd.js s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/
        aws s3 cp --only-show-errors build/openttd.wasm s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/

        # Invalidate the cache of the CloudFront distribution
        aws cloudfront create-invalidation --distribution-id ${{ secrets.PREVIEW_CF_DISTRIBUTION_ID }} --paths "/${{ github.event.client_payload.folder }}/*"
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

    - name: Update deployment status to success
      uses: octokit/request-action@v2.x
      with:
        route: POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses
        mediaType: |
          previews:
          - ant-man
          - flash
        owner: ${{ github.event.repository.owner.login }}
        repo: ${{ github.event.repository.name }}
        deployment_id: ${{ github.event.client_payload.deployment_id }}
        state: success
        environment_url: https://preview.openttd.org/${{ github.event.client_payload.folder }}/
      env:
        GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }}

    - if: failure()
      name: Update deployment status to failure
      uses: octokit/request-action@v2.x
      with:
        route: POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses
        mediaType: |
          previews:
          - ant-man
          - flash
        owner: ${{ github.event.repository.owner.login }}
        repo: ${{ github.event.repository.name }}
        deployment_id: ${{ github.event.client_payload.deployment_id }}
        state: failure
      env:
        GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }}
