name: Package
run-name: Package ${{ github.sha }} by @${{ github.actor }}

on:
  workflow_dispatch:

permissions:
  contents: write

env:
  BOOST_VERSION: 1_85_0
  SNAPWEB_VERSION: v0.8.0

jobs:

  release:
    runs-on: ubuntu-latest
    name: Create release
    outputs:
      tag: ${{ steps.draft_release.outputs.tag }}
    steps:
      - name: Get dependencies
        run: sudo apt-get update && sudo apt-get install -yq python3
        env:
          DEBIAN_FRONTEND: noninteractive
      - name: Checkout
        uses: actions/checkout@v4
      - name: Create release notes
        run: $GITHUB_WORKSPACE/extras/changelog_current_version.py $GITHUB_WORKSPACE/changelog.md > $GITHUB_WORKSPACE/changelog_current.md
      - name: Create draft release
        id: draft_release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          URL=$( \
              gh release create v0.0.0 \
              --draft \
              --repo="$GITHUB_REPOSITORY" \
              --title="Snapcast v${{ github.sha }}" \
              --notes-file changelog_current.md \
              )
          echo "tag=$(basename $URL)" >> $GITHUB_OUTPUT

  deb:
    needs: release
    strategy:
      fail-fast: false
      matrix:
        debian:
          - bullseye
          - bookworm
        arch:
          - amd64
          - armhf
          - arm64
        include:
          - arch: "amd64"
            os: ubuntu-latest
            image_prefix: "debian:"
          - arch: "armhf"
            os: self-hosted-rpi4
            image_prefix: "badaix/raspios-lite:"
          - arch: "arm64"
            os: self-hosted-rpi5
            image_prefix: "badaix/raspios-lite:"

    runs-on: ${{ matrix.os }}
    name: deb (${{ matrix.arch }}, ${{ matrix.debian }})
    timeout-minutes: 240

    container:
      image: ${{matrix.image_prefix}}${{matrix.debian}}
    steps:
      - name: Get dependencies
        run: apt-get update && apt-get install -yq wget debhelper build-essential cmake git rename libatomic1 libasound2-dev libsoxr-dev libvorbisidec-dev libvorbis-dev libflac-dev libopus-dev alsa-utils libpulse-dev libavahi-client-dev avahi-daemon libexpat1-dev python3 ccache unzip
        env:
          DEBIAN_FRONTEND: noninteractive
      - name: Get GitHub cli
        run: |
          (type -p wget >/dev/null || (apt update && apt-get install wget -y)) \
          && mkdir -p -m 755 /etc/apt/keyrings \
          && wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \
          && chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \
          && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
          && apt update \
          && apt install gh -y
      - name: Checkout
        uses: actions/checkout@v4
      - name: Setup environment
        run: |
          echo "PARENT_DIR=$(dirname $GITHUB_WORKSPACE)" >> $GITHUB_ENV
          BOOST_DOT_VERSION=$(echo ${BOOST_VERSION} | sed 's/_/./g')
          echo "BOOST_DOT_VERSION=$BOOST_DOT_VERSION" >> $GITHUB_ENV
          echo "BOOST=boost_${BOOST_VERSION}" >> $GITHUB_ENV
          ln -s extras/package/debian debian
      - name: Create changelog
        run: |
          $GITHUB_WORKSPACE/debian/changelog_md2deb.py $GITHUB_WORKSPACE/changelog.md > $GITHUB_WORKSPACE/debian/changelog
          cat $GITHUB_WORKSPACE/debian/changelog
      - name: Clean up
        run: rm -rf ${{env.PARENT_DIR}}/snap*_*.deb
      - name: Cache boost
        id: cache-boost
        uses: actions/cache@v4
        with:
          path: ${{env.BOOST}}
          key: ${{env.BOOST}}
      - name: Get boost
        if: steps.cache-boost.outputs.cache-hit != 'true'
        run: |
          wget https://boostorg.jfrog.io/artifactory/main/release/${{env.BOOST_DOT_VERSION}}/source/${{env.BOOST}}.tar.bz2
          tar xjf ${{env.BOOST}}.tar.bz2
      - name: cache ccache
        id: cache-ccache
        uses: actions/cache@v4
        with:
          # TODO: use environment variable $HOME/.ccache
          path: /home/runner/.ccache
          key: ${{ matrix.os }}-${{ matrix.debian }}-ccache-${{ github.sha }}
          restore-keys: ${{ matrix.os }}-${{ matrix.debian }}-ccache-
      - name: Get Snapweb
        run: |
          wget https://github.com/badaix/snapweb/releases/download/${SNAPWEB_VERSION}/snapweb.zip
          unzip snapweb.zip -d snapweb
      - name: Create deb package
        env:
          # TODO: use environment variable $HOME/.ccache
          CCACHE_DIR: /home/runner/.ccache
        run: |
          fakeroot make -f debian/rules CMAKEFLAGS="-DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DBOOST_ROOT=$GITHUB_WORKSPACE/${{env.BOOST}} -DCMAKE_BUILD_TYPE:STRING=Release -DREVISION=${{ github.sha }} -DBUILD_WITH_JACK=OFF -DBUILD_WITH_PULSE=OFF -DSNAPWEB_DIR:STRING=$GITHUB_WORKSPACE/snapweb" binary
          rename 's/_${{ matrix.arch }}/_${{ matrix.arch }}_${{ matrix.debian }}/g' ../snap*_${{ matrix.arch }}.deb
          fakeroot make -f debian/rules clean
          fakeroot make -f debian/rules CMAKEFLAGS="-DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DBOOST_ROOT=$GITHUB_WORKSPACE/${{env.BOOST}} -DCMAKE_BUILD_TYPE:STRING=Release -DREVISION=${{ github.sha }} -DBUILD_WITH_JACK=OFF -DSNAPWEB_DIR:STRING=$GITHUB_WORKSPACE/snapweb" binary
          rm ../snapserver_*_${{ matrix.arch }}.deb
          rename 's/_${{ matrix.arch }}/_${{ matrix.arch }}_${{ matrix.debian }}_with-pulse/g' ../snap*_${{ matrix.arch }}.deb
      - name: Release artifacts
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          git config --global --add safe.directory $GITHUB_WORKSPACE
          gh release upload ${{needs.release.outputs.tag}} ${{env.PARENT_DIR}}/snap*_*.deb


  win:
    needs: release
    runs-on: windows-2019
    name: win

    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Checkout Snapcast
        uses: actions/checkout@v4
        with:
          repository: badaix/snapcast
          path: src/snapcast
          ref: ${{ env.VERSION }}
      - name: Cache dependencies
        id: cache-dependencies
        uses: actions/cache@v4
        with:
          #path: ${VCPKG_INSTALLATION_ROOT}\installed
          path: c:\vcpkg\installed
          key: ${{ runner.os }}-dependencies
      - name: Get dependenciesenv
        if: steps.cache-dependencies.outputs.cache-hit != 'true'
        run: vcpkg.exe install libflac libvorbis soxr opus boost-asio --triplet x64-windows
      - name: configure
        run: |
          echo vcpkg installation root: $env:VCPKG_INSTALLATION_ROOT
          cmake -S . -B build -G "Visual Studio 16 2019" -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="x64-windows" -DCMAKE_BUILD_TYPE="Release" -DREVISION="${{ github.sha }}" -DWERROR=ON -DBUILD_TESTS=ON
      - name: build
        run: cmake --build build --config Release --parallel 3 --verbose
      - name: installer
        run: |
          mkdir bundle
          copy ${env:VCPKG_INSTALLATION_ROOT}\installed\x64-windows\bin\FLAC.dll bundle\
          copy ${env:VCPKG_INSTALLATION_ROOT}\installed\x64-windows\bin\ogg.dll bundle\
          copy ${env:VCPKG_INSTALLATION_ROOT}\installed\x64-windows\bin\opus.dll bundle\
          copy ${env:VCPKG_INSTALLATION_ROOT}\installed\x64-windows\bin\vorbis.dll bundle\
          copy ${env:VCPKG_INSTALLATION_ROOT}\installed\x64-windows\bin\soxr.dll bundle\
          copy "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Redist\MSVC\v142\vc_redist.x64.exe" bundle\
          copy bin\Release\snapclient.exe bundle\
          Compress-Archive -Path bundle\* -Destination snapclient_win64.zip
      - name: Release artifacts
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          git config --global --add safe.directory .
          gh release upload ${{needs.release.outputs.tag}} snapclient_win64.zip

  # mac:
  #   strategy:
  #     fail-fast: false
  #     matrix:
  #       xcode: ['11']

  #   runs-on: macos-latest
  #   name: mac (xcode ${{ matrix.xcode }})

  #   steps:
  #   - name: Checkout
  #     uses: actions/checkout@v4
  #   - name: Checkout Snapcast
  #     uses: actions/checkout@v4
  #     with:
  #       repository: badaix/snapcast
  #       path: src/snapcast
  #       ref: ${{ env.VERSION }}
  #   - name: Setup environment
  #     run: |
  #       BOOST_DOT_VERSION=$(echo ${BOOST_VERSION} | sed 's/_/./g')
  #       echo "BOOST_DOT_VERSION=$BOOST_DOT_VERSION" >> $GITHUB_ENV
  #       echo "BOOST=boost_${BOOST_VERSION}" >> $GITHUB_ENV
  #   - name: Get dependencies
  #     run: brew install pkgconfig libsoxr ccache expat
  #   - name: Cache boost
  #     id: cache-boost
  #     uses: actions/cache@v4
  #     with:
  #       path: ${{env.BOOST}}
  #       key: ${{ runner.os }}-boost
  #   - name: Get boost
  #     if: steps.cache-boost.outputs.cache-hit != 'true'
  #     run: |
  #       wget https://boostorg.jfrog.io/artifactory/main/release/${{env.BOOST_DOT_VERSION}}/source/${{env.BOOST}}.tar.bz2
  #       tar xjf ${{env.BOOST}}.tar.bz2
  #   - name: Cache ccache
  #     id: cache-ccache
  #     uses: actions/cache@v4
  #     with:
  #       path: /Users/runner/.ccache
  #       key: ${{ runner.os }}-ccache-${{ github.sha }}
  #       restore-keys: ${{ runner.os }}-ccache-
  #   #- name: ccache dump config
  #   #  run: ccache -p
  #   - name: configure
  #     run: cmake -S $GITHUB_WORKSPACE/src/snapcast -B build -DBOOST_ROOT=$GITHUB_WORKSPACE/${{env.BOOST}} -DCMAKE_BUILD_TYPE=Release -DREVISION=${{ github.sha }} -DWERROR=ON -DBUILD_TESTS=ON -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_FLAGS="-I/usr/local/include -Wno-deprecated-declarations"
  #   - name: build
  #     run: cmake --build build --parallel 3


  # rpm:
  #   if: ${{ false }}  # disable for now
  #   strategy:
  #     fail-fast: false
  #     matrix:
  #       image:
  #         - 34
  #         - 35
  #       os:
  #         - ubuntu-latest
  #         - self-hosted-rpi4
  #       include:
  #         - os: ubuntu-latest
  #           arch: "x86_64"
  #         - os: self-hosted-rpi4
  #           arch: "armv7hl"

  #   runs-on: ${{ matrix.os }}
  #   name: rpm (${{ matrix.arch }}, fedora ${{ matrix.image }})

  #   container:
  #     image: fedora:${{matrix.image}}

  #   steps:
  #   - name: Get dependencies
  #     run: dnf -y update && dnf -y install wget git rpm-build gcc-c++ cmake boost-devel alsa-lib-devel avahi-devel libatomic libvorbis-devel opus-devel pulseaudio-libs-devel flac-devel soxr-devel libstdc++-static expat-devel
  #   - name: Checkout
  #     uses: actions/checkout@v4
  #   - name: Checkout Snapcast
  #     uses: actions/checkout@v4
  #     with:
  #       repository: badaix/snapcast
  #       path: src/snapcast
  #       ref: ${{ env.VERSION }}
  #   - name: Create rpm package
  #     run: |
  #       mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
  #       cp rpm/* ~/rpmbuild/SOURCES/
  #       tar -C $GITHUB_WORKSPACE/src/ -czvf ~/rpmbuild/SOURCES/snapcast.tar.gz snapcast
  #       rpmbuild --nodebuginfo --define '_reversion ${{ github.sha }}' --define '_version ${{ env.VERSION }}' -bb ~/rpmbuild/SOURCES/snapcast.spec
  #   - name: Archive artifacts
  #     uses: actions/upload-artifact@v4
  #     with:
  #       name: snapcast_${{ matrix.arch }}-fedora-${{matrix.image}}-${{ github.sha }}
  #       path: ~/rpmbuild/RPMS/${{ matrix.arch }}/snap*.rpm

