name: build

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
  release:
    types:
      - created
  workflow_dispatch:

jobs:
  build-firmware:
    runs-on: ubuntu-latest

    steps:
      - name: Download SummerCart64 repository
        uses: actions/checkout@v4

      - name: Set package version
        uses: frabert/replace-string-action@v2
        id: version
        with:
          pattern: '\/'
          string: '${{ github.ref_name }}'
          replace-with: '-'

      - name: Build firmware
        run: ./docker_build.sh release --force-clean
        env:
          SC64_VERSION: ${{ steps.version.outputs.replaced }}

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: sc64-pkg-${{ steps.version.outputs.replaced }}
          path: |
            sc64-extra-${{ steps.version.outputs.replaced }}.zip
            sc64-firmware-${{ steps.version.outputs.replaced }}.bin

      - name: Upload release assets
        if: github.event_name == 'release' && github.event.action == 'created'
        uses: softprops/action-gh-release@v0.1.15
        with:
          files: |
            sc64-extra-${{ steps.version.outputs.replaced }}.zip
            sc64-firmware-${{ steps.version.outputs.replaced }}.bin

  build-deployer:
    strategy:
      matrix:
        version: [windows, windows-32bit, linux, macos]
        include:
          - version: windows
            os: windows-latest
            executable: target/release/sc64deployer.exe
            package-name: sc64-deployer-windows
            package-params: -c -a -f
            package-extension: zip

          - version: windows-32bit
            os: windows-latest
            build-params: --target=i686-pc-windows-msvc
            executable: target/i686-pc-windows-msvc/release/sc64deployer.exe
            package-name: sc64-deployer-windows-32bit
            package-params: -c -a -f
            package-extension: zip

          - version: linux
            os: ubuntu-latest
            linux-packages: libudev-dev
            executable: target/release/sc64deployer
            package-name: sc64-deployer-linux
            package-params: -czf
            package-extension: tar.gz

          - version: macos
            os: macos-latest
            executable: target/release/sc64deployer
            package-name: sc64-deployer-macos
            package-params: -czf
            package-extension: tgz

    runs-on: ${{ matrix.os }}

    steps:
      - name: Download SummerCart64 repository
        uses: actions/checkout@v4

      - name: Set package version
        uses: frabert/replace-string-action@v2
        id: version
        with:
          pattern: '\/'
          string: '${{ github.ref_name }}'
          replace-with: '-'

      - name: Install linux packages
        if: matrix.linux-packages
        run: |
          sudo apt-get update
          sudo apt-get -y install ${{ matrix.linux-packages }}

      - name: Build deployer
        run: cargo b -r ${{ matrix.build-params }}
        working-directory: sw/deployer

      - name: Package executable
        run: |
          mkdir -p ./package
          cp ${{ matrix.executable }} ./package/
          cd ./package
          tar ${{ matrix.package-params }} ./${{ matrix.package-name }}-${{ steps.version.outputs.replaced }}.${{ matrix.package-extension }} *
        working-directory: sw/deployer

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.package-name }}-${{ steps.version.outputs.replaced }}
          path: sw/deployer/package/${{ matrix.package-name }}-${{ steps.version.outputs.replaced }}.${{ matrix.package-extension }}

      - name: Upload release assets
        if: github.event_name == 'release' && github.event.action == 'created'
        uses: softprops/action-gh-release@v0.1.15
        with:
          files: |
            sw/deployer/package/${{ matrix.package-name }}-${{ steps.version.outputs.replaced }}.${{ matrix.package-extension }}

  publish-website:
    if: github.ref == 'refs/heads/main'

    permissions:
      contents: read
      pages: write
      id-token: write

    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}

    runs-on: ubuntu-latest

    steps:
      - name: Download SummerCart64 repository
        uses: actions/checkout@v4

      - name: Copy BOM file to the website folder
        run: cp ./hw/pcb/sc64v2_bom.html ./web

      - name: Setup GitHub pages
        uses: actions/configure-pages@v4

      - name: Upload website artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: ./web

      - name: Publish website from uploaded artifact
        id: deployment
        uses: actions/deploy-pages@v4
