name: multi-arch build

on:
  push:
    branches:
      - master
      - develop

jobs:
  build:
    name: ${{ matrix.type }} on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          # todo: broken ubuntu dependencies, accepting PRs
          #- { os: ubuntu-22.04, type: "linux_386_ssl3" }
          - { os: ubuntu-20.04, type: "linux_amd64_ssl1" }
          - { os: ubuntu-22.04, type: "linux_amd64_ssl3" }
          - { os: ubuntu-20.04, type: "linux_arm64_ssl1" }
          - { os: ubuntu-22.04, type: "linux_arm64_ssl3" }
          - { os: ubuntu-22.04, type: "linux_ppc64le_ssl3" }
          # todo: broken ubuntu dependencies, accepting PRs
          #- { os: ubuntu-22.04, type: "linux_riscv64_ssl3" }
          - { os: windows-2019, type: "windows_amd64", vcpkgCommitId: "6ca56aeb457f033d344a7106cb3f9f1abf8f4e98", triplet: "x64-windows-static" }
          - { os: macos-12, type: "macos_amd64" }
          # todo: do not enable until github actions adds support to apple silicon, accepting PRs
          # - { os: macos-12, type: "macos_arm64" }
    steps:
      - name: Checkout current repo
        uses: actions/checkout@v3
        with:
          submodules: "recursive"

      - name: Get version
        shell: bash
        run: |
          set -xeo pipefail
          # Get latest commit short hash
          HASH_VERSION=$(git rev-parse --short HEAD)

          # Strip git ref prefix from version
          VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
          
          # Strip "v" prefix from tag name
          [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
          
          # Use Docker `latest` tag convention
          [ "$VERSION" == "master" ] && VERSION=latest

          HASH_VERSION=$(echo "$HASH_VERSION" | awk '{print tolower($0)}')
          VERSION=$(echo "$VERSION" | awk '{print tolower($0)}')
          TYPE=${{ matrix.type }}
          SAFE_TYPE=${TYPE///}  # linux_amd64_ -> linux_amd64_

          REVISION=4.0.${{ github.run_number }}
          GH_MATRIX_OS=${{ matrix.os }}
          GH_MATRIX_TYPE=${{ matrix.type }}

          # Store variable for future use
          echo "HASH_VERSION=$HASH_VERSION" >> $GITHUB_ENV
          echo "VERSION=$VERSION" >> $GITHUB_ENV
          echo "TYPE=$TYPE" >> $GITHUB_ENV
          echo "SAFE_TYPE=$SAFE_TYPE" >> $GITHUB_ENV
          echo "SSL_TYPE=$SSL_TYPE" >> $GITHUB_ENV
          echo "REVISION=$REVISION" >> $GITHUB_ENV
          echo "GH_MATRIX_OS=$GH_MATRIX_OS" >> $GITHUB_ENV
          echo "GH_MATRIX_TYPE=$GH_MATRIX_TYPE" >> $GITHUB_ENV

          # Print debug info
          echo "hash version: $HASH_VERSION"
          echo "version: $VERSION"
          echo "safe arch: $SAFE_ARCH"
          echo "ssl type: $SSL_TYPE"

          echo "Variables:"
          
          # Save env to file
          cat $GITHUB_ENV > github.env

      - name: Cache packages cache
        uses: actions/cache@v3
        with:
          path:  ~/tdlight-java-natives/tdlight-java-natives/.cache
          key: ${{ runner.os }}-v3-packages-${{ env.SAFE_TYPE }}-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-v3-packages-${{ env.SAFE_TYPE }}-


      - name: Setup Java (Snapshot)
        if: github.ref == 'refs/heads/develop'
        uses: actions/setup-java@v3
        with:
          java-version: 11
          distribution: temurin
          server-id: mchv-snapshot-distribution
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
          cache: 'maven'
      - name: Setup Java (Release)
        if: github.ref != 'refs/heads/develop'
        uses: actions/setup-java@v3
        with:
          java-version: 11
          distribution: temurin
          server-id: mchv-release-distribution
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
          cache: 'maven'

      - name: Setup PHP with Readline extension
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.0'
          extensions: readline
      - name: Install ubuntu 20.04 dependencies
        if: matrix.os == 'ubuntu-20.04'
        shell: bash
        run: |  
          export DEBIAN_FRONTEND=noninteractive
          sudo apt-get --assume-yes update
          sudo apt-get --assume-yes install make git zlib1g-dev libssl-dev gperf php-cli cmake default-jdk clang-12 lld-12 libc++-12-dev libc++abi-12-dev libgcc-9-dev libunwind-dev libclang-common-12-dev ccache maven
#      - name: Install ubuntu 20.04 dependencies (cached)
#        if: matrix.os == 'ubuntu-20.04'
#        uses: awalsh128/cache-apt-pkgs-action@latest
#        with:
#          packages: make git zlib1g-dev libssl-dev gperf php-cli cmake default-jdk clang-12 lld-12 libc++-12-dev libc++abi-12-dev libgcc-9-dev libunwind-dev libclang-common-12-dev ccache maven
#          version: 1.0
      - name: Install ubuntu 22.04 dependencies
        if: matrix.os == 'ubuntu-22.04'
        shell: bash
        run: |
          export DEBIAN_FRONTEND=noninteractive
          sudo apt-get --assume-yes update
          sudo apt-get --assume-yes install make git zlib1g-dev libssl-dev gperf php-cli cmake default-jdk clang-14 lld-14 libc++-14-dev libc++abi-14-dev libgcc-11-dev libunwind-14-dev libclang-common-14-dev ccache maven
#      - name: Install ubuntu 22.04 dependencies (cached)
#        if: matrix.os == 'ubuntu-22.04'
#        uses: awalsh128/cache-apt-pkgs-action@latest
#        with:
#          packages: make git zlib1g-dev libssl-dev gperf php-cli cmake default-jdk clang-14 lld-14 libc++-14-dev libc++abi-14-dev libgcc-11-dev libunwind-14-dev libclang-common-14-dev ccache maven
#          version: 1.0
      - name: Install custom dependencies
        shell: bash
        run: |
          set -xeo pipefail
          echo "REVISION: $REVISION"

          if [[ -f "./.github/workflows/scripts/install_deps_${SAFE_TYPE}.sh" ]]; then
            if [[ "$GH_MATRIX_OS" == *"windows"* || "$GH_MATRIX_OS" == *"macos"* ]]; then
              ./.github/workflows/scripts/install_deps_${SAFE_TYPE}.sh
            else
              sudo ./.github/workflows/scripts/install_deps_${SAFE_TYPE}.sh
            fi
          fi
      - name: Run sccache-cache
        uses: mozilla-actions/sccache-action@v0.0.3
        env:
          SCCACHE_GHA_ENABLED: "true"
      - name: Install MSVC
        if: matrix.os == 'windows-2019'
        uses: ilammy/msvc-dev-cmd@v1
        with:
          toolset: 14.0
          vs-version: '[16.4,16.5)'
      - name: Setup cmake
        if: matrix.os == 'windows-2019'
        uses: lukka/get-cmake@latest
      - name: Set up Maven
        uses: stCarolas/setup-maven@v4.5
        with:
          maven-version: 3.8.2
      - name: Setup NASM
        if: matrix.os == 'windows-2019'
        uses: ilammy/setup-nasm@v1
      - name: Restore artifacts, or setup vcpkg (do not install any package)
        if: matrix.os == 'windows-2019'
        uses: lukka/run-vcpkg@v10.2
        with:
          # Just install vcpkg for now, do not install any ports in this step yet.
          setupOnly: true
          # Location of the vcpkg submodule in the Git repository.
          vcpkgDirectory: '${{ github.workspace }}/vcpkg'
          vcpkgGitCommitId: '${{ matrix.vcpkgCommitId}}'
          # Since the cache must be invalidated when content of the vcpkg.json file changes, let's
          # compute its hash and append this to the computed cache's key.
          appendedCacheKey: ${{ hashFiles( '**/vcpkg_manifest/vcpkg.json' ) }}
          vcpkgTriplet: ${{ matrix.triplet }}
          # Ensure the vcpkg artifacts are cached, they are generated in the 'CMAKE_BINARY_DIR/vcpkg_installed' directory.
          additionalCachedPaths: ${{ github.workspace }}/vcpkg
      - name: Install vcpkg deps
        if: matrix.os == 'windows-2019'
        run: |
          set -xeo pipefail
          ./vcpkg/vcpkg install gperf openssl:x64-windows-static zlib:x64-windows-static
        shell: bash
      - name: Build
        shell: bash
        run: |
          set -xeo pipefail
          echo "REVISION: $REVISION"
          
          source ./.github/workflows/scripts/build_${SAFE_TYPE}.sh
        env:
          SCCACHE_GHA_ENABLED: "true"
      - uses: actions/upload-artifact@v3
        with:
          name: tdlight-natives-${{env.REVISION}}-${{env.TYPE}}.jar
          path: natives/target-${{env.TYPE}}/tdlight-natives-${{env.REVISION}}-${{env.TYPE}}.jar
      - name: Deploy to Maven (Snapshot)
        if: github.ref == 'refs/heads/develop'
        shell: bash
        run: |
          set -xeo pipefail
          echo "REVISION: $REVISION"
          echo "TYPE: $TYPE"
          
          mvn -B -f natives/pom.xml -Drevision="$REVISION" -Dnative.type.classifier="$TYPE" clean package
          mvn -B org.apache.maven.plugins:maven-deploy-plugin:3.1.1:deploy-file -Durl=https://mvn.mchv.eu/repository/mchv-snapshot \
                                                                            -DrepositoryId=mchv-snapshot-distribution \
                                                                            -Dfile=natives/target-$TYPE/tdlight-natives-$REVISION-$TYPE.jar \
                                                                            -Dpackaging=pom \
                                                                            -DgroupId=it.tdlight \
                                                                            -DartifactId=tdlight-natives \
                                                                            -Dversion=$REVISION \
                                                                            -Drevision=$REVISION \
                                                                            -Dclassifier=$TYPE \
                                                                            -Dnative.type.classifier="$TYPE"
          if [[ "$TYPE" == "linux_amd64_ssl1" ]]; then
            mvn -B org.apache.maven.plugins:maven-deploy-plugin:3.1.1:deploy-file -Durl=https://mvn.mchv.eu/repository/mchv-snapshot \
                                                                              -DrepositoryId=mchv-snapshot-distribution \
                                                                              -Dfile=natives/.ci-friendly-pom.xml \
                                                                              -Dpackaging=pom \
                                                                              -DgroupId=it.tdlight \
                                                                              -DartifactId=tdlight-natives \
                                                                              -Dversion=$REVISION \
                                                                              -Drevision=$REVISION \
                                                                              -Dnative.type.classifier="$TYPE"
          fi
          
          echo "Done."
          exit 0
        env:
          MAVEN_USERNAME: ${{ secrets.MCHV_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.MCHV_TOKEN }}
      - name: Deploy to Maven (Release)
        if: github.ref == 'refs/heads/master'
        shell: bash
        run: |
          set -xeo pipefail
          echo "REVISION: $REVISION"
          echo "TYPE: $TYPE"
          
          mvn -B -f natives/pom.xml -Drevision="$REVISION" -Dnative.type.classifier="$TYPE" clean package
          mvn -B org.apache.maven.plugins:maven-deploy-plugin:3.1.1:deploy-file -Durl=https://mvn.mchv.eu/repository/mchv \
                                                                            -DrepositoryId=mchv-release-distribution \
                                                                            -Dfile=natives/target-$TYPE/tdlight-natives-$REVISION-$TYPE.jar \
                                                                            -Dpackaging=pom \
                                                                            -DgroupId=it.tdlight \
                                                                            -DartifactId=tdlight-natives \
                                                                            -Dversion=$REVISION \
                                                                            -Drevision=$REVISION \
                                                                            -Dclassifier=$TYPE \
                                                                            -Dnative.type.classifier="$TYPE"
          if [[ "$TYPE" == "linux_amd64_ssl1" ]]; then
            mvn -B org.apache.maven.plugins:maven-deploy-plugin:3.1.1:deploy-file -Durl=https://mvn.mchv.eu/repository/mchv \
                                                                              -DrepositoryId=mchv-release-distribution \
                                                                              -Dfile=natives/.ci-friendly-pom.xml \
                                                                              -Dpackaging=pom \
                                                                              -DgroupId=it.tdlight \
                                                                              -DartifactId=tdlight-natives \
                                                                              -Dversion=$REVISION \
                                                                              -Drevision=$REVISION \
                                                                              -Dnative.type.classifier="$TYPE"
          fi
          
          echo "Done."
          exit 0
        env:
          MAVEN_USERNAME: ${{ secrets.MCHV_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.MCHV_TOKEN }}
