name: windows-ci

on:
  - push
  - pull_request

jobs:
  windows-ci:
    runs-on: windows-latest

    strategy:
      fail-fast: false
      matrix:
        compiler:
          - bcc
          - mingw64
          - clang
        cpu:
          - x86
          - x86_64
        exclude:
          - compiler: bcc
            cpu: x86_64
          - compiler: clang
            cpu: x86
        strictness:
          - "normal"
          - "strict"

    steps:

      - name: Configure environment
        shell: bash
        run: |
          set -ex
          {
            case ${{matrix.cpu}} in
              (x86)    echo MINGWxx="MINGW32"
                       echo "msys_cpu=i686" ;;
              (x86_64) echo MINGWxx="MINGW64"
                       echo "msys_cpu=${{matrix.cpu}}" ;;
            esac
            case ${{matrix.compiler}} in
              (clang)  echo MINGWxx="CLANG64" ;;
            esac
          } >> $GITHUB_ENV

      - name: Install packages
        uses: msys2/setup-msys2@v2
        with:
          msystem: ${{ env.MINGWxx }}
          location: d:/
          update: true
          install: >
            mingw-w64-${{ env.msys_cpu }}-ccache
            mingw-w64-${{ env.msys_cpu }}-gcc
            mingw-w64-${{ env.msys_cpu }}-make
            mingw-w64-${{ env.msys_cpu }}-allegro
            mingw-w64-${{ env.msys_cpu }}-bzip2
            mingw-w64-${{ env.msys_cpu }}-cairo
            mingw-w64-${{ env.msys_cpu }}-curl
            mingw-w64-${{ env.msys_cpu }}-ghostscript
            mingw-w64-${{ env.msys_cpu }}-openssl
            openssl-devel

      - name: 'Add packages available on 64-bit hosts only'
        if: matrix.cpu != 'x86'
        shell: msys2 {0}
        run: |
          pacman -S --noconfirm mingw-w64-${{ env.msys_cpu }}-postgresql
          pacman -S --noconfirm mingw-w64-${{ env.msys_cpu }}-qt5-base
          pacman -S --noconfirm mingw-w64-${{ env.msys_cpu }}-libgd
          pacman -S --noconfirm mingw-w64-${{ env.msys_cpu }}-libmariadbclient
          pacman -S --noconfirm mingw-w64-${{ env.msys_cpu }}-firebird
          pacman -S --noconfirm mingw-w64-${{ env.msys_cpu }}-freeimage

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

      - run: pwd
        shell: msys2 {0}

      - run: ls
        shell: msys2 {0}

      - name: Prepare ccache using action
        if: matrix.compiler != 'bcc'
        uses: hendrikmuhs/ccache-action@v1.2.10
        with:
          key: windows-${{ matrix.cpu }}-${{ matrix.compiler }}-${{ matrix.strictness }}-ci
          max-size: "32M"

      - name: Configure build shell
        shell: msys2 {0}
        run: |
          set -ex
          HB_USER_CFLAGS=""
          HB_USER_LDFLAGS=""

          case ${{matrix.compiler}} in
            (clang)
               pacman -S --noconfirm mingw-w64-${{ env.msys_cpu }}-clang
               PATH="$PATH:/mingw64/bin/"
               tee ./.bashrc <<EOMCLPTH
          export PATH="\$PATH:/mingw64/bin/" # add ccache location
          EOMCLPTH
               ;;
          esac

          case ${{matrix.strictness}} in
            normal) ;;
            strict) case ${{matrix.compiler}} in
                      (bcc) HB_USER_CFLAGS="$HB_USER_CFLAGS -w!" ;;
                      (*)   HB_USER_CFLAGS="$HB_USER_CFLAGS -Werror" ;;
                    esac ;;
          esac
          tee -a ./.bashrc <<EOENV

          export HB_BUILD_TEST="${{matrix.strictness}}"
          export HB_BUILD_VERBOSE="yes"
          export HBMK_WITH_SQLITE3="local"
          export HB_USER_CFLAGS="$HB_USER_CFLAGS"
          export HB_USER_LDFLAGS="$HB_USER_LDFLAGS"
          export HB_CCACHE=$(which ccache.exe)
          export mingwxx="$(echo "$MINGWxx" | tr A-Z a-z)"
          EOENV

          case ${{matrix.compiler}} in
            bcc)
              curl -LO "http://altd.embarcadero.com/download/bcppbuilder/freecommandLinetools.exe"
              ./freecommandLinetools.exe -s -verbose
              find /c/Borland -type d || exit 1
              tee -a ./.bashrc <<EOMSYSENV
          export PATH="/c/Borland/BCC55/Bin:\$PATH"
          export HB_WITH_CURL="/d/msys64/$mingwxx/include"
          export HB_CCACHE=""
          EOMSYSENV
              ;;
            *)
              tee -a ./.bashrc <<'EOCCACHE'
          # Reconfigure ccache in msys2
          ccache --set-config="cache_dir=$(pwd)/.ccache"
          ccache --set-config=max_size=32M
          ccache --set-config=compression=true
          ccache -p
          export HB_WITH_OPENSSL="/usr/include"
          EOCCACHE
              ;;
          esac


      - name: Build Harbour
        shell: msys2 {0}
        run: |
          echo ::group::Build Harbour
          set -ex
          source ./.bashrc
          mingw32-make.exe -j2 \
            HB_CPU=${{matrix.cpu}} \
            HB_BUILD_CONTRIBS=no \
            HB_COMPILER=${{matrix.compiler}}

      - name: Build contribs
        shell: msys2 {0}
        run: |
          echo ::group::Build contribs
          set -ex
          source ./.bashrc
          mingw32-make.exe -j2 \
            -C contrib \
            HB_CPU=${{matrix.cpu}} \
            HB_COMPILER=${{matrix.compiler}}

      - name: Run tests
        shell: msys2 {0}
        run: |
          echo ::group::Run tests
          set -ex
          bin/win/${{matrix.compiler}}/hbtest.exe
