name: Release
on:
  push:
    tags:
      - 'v*'

jobs:
  build-macos:
    runs-on: macos-11
    steps:
      -
        name: Checkout
        uses: actions/checkout@v3
      -
        name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'
      -
        name: Build docs to /help
        run: |
          python3 -m pip install --upgrade pip
          python3 -m pip install --upgrade wheel
          python3 -m pip install mkdocs-material
          mkdocs build -d help
      -
        name: Install PyOxidizer
        run: python3 -m pip install pyoxidizer==0.22.0
      -
        name: Download ffmpeg
        uses: carlosperate/download-file-action@v2
        id: download_ffmpeg
        with:
          file-url: 'https://evermeet.cx/ffmpeg/getrelease/ffmpeg/7z'
          file-name: 'ffmpeg-macos.7z'
          location: '.'
      -
        name: Process ffmpeg
        run: |
          cd $GITHUB_WORKSPACE
          7z e ffmpeg-macos.7z -obin "ffmpeg"
      -
        name: Build Hydrus
        run: |
          cd $GITHUB_WORKSPACE
          cp static/build_files/macos/pyoxidizer.bzl pyoxidizer.bzl
          cp static/build_files/macos/requirements.txt requirements.txt
          basename $(rustc --print sysroot) | sed -e "s/^stable-//" > triple.txt
          pyoxidizer build --release
          cd build/$(head -n 1 triple.txt)/release
          mkdir -p "Hydrus Network.app/Contents/MacOS"
          mkdir -p "Hydrus Network.app/Contents/Resources"
          mkdir -p "Hydrus Network.app/Contents/Frameworks"
          mv install/static/icon.icns "Hydrus Network.app/Contents/Resources/icon.icns"
          cp install/static/build_files/macos/Info.plist "Hydrus Network.app/Contents/Info.plist"
          cp install/static/build_files/macos/ReadMeFirst.rtf ./ReadMeFirst.rtf
          cp install/static/build_files/macos/running_from_app "install/running_from_app"
          ln -s /Applications ./Applications
          mv install/* "Hydrus Network.app/Contents/MacOS/"
          rm -rf install
      -
        name: Build DMG
        run: |
          cd $GITHUB_WORKSPACE
          temp_dmg="$(mktemp).dmg"
          hdiutil create "$temp_dmg" -ov -volname "HydrusNetwork" -fs HFS+ -format UDZO -srcfolder "$GITHUB_WORKSPACE/build/$(head -n 1 triple.txt)/release"
          mv "$temp_dmg" HydrusNetwork.dmg
      -
        name: Upload a Build Artifact
        uses: actions/upload-artifact@v3
        with:
          name: MacOS-DMG
          path: HydrusNetwork.dmg
          if-no-files-found: error
          retention-days: 2

  build-ubuntu:
    runs-on: ubuntu-20.04
    steps:
      -
        name: Checkout
        uses: actions/checkout@v3
        with:
          path: hydrus
      -
        name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'
          architecture: x64
      -
        name: APT Install
        run: |
          sudo apt-get update
          sudo apt-get install -y libmpv1
      -
        name: Pip Install
        run: python3 -m pip install -r hydrus/static/build_files/linux/requirements.txt
      -
        name: Build docs to /help
        run: mkdocs build -d help
        working-directory: hydrus
      -
        name: Build Hydrus
        run: |
          cp hydrus/static/build_files/linux/hydrus_client.spec hydrus_client.spec
          cp hydrus/static/build_files/linux/hydrus_server.spec hydrus_server.spec
          pyinstaller hydrus_server.spec
          pyinstaller hydrus_client.spec
      -
        name: Remove Chonk
        run: |
            find dist/hydrus_client/ -type f -name "*.pyc" -delete
            while read line; do find dist/hydrus_client/ -type f -name "${line}" -delete ; done < hydrus/static/build_files/linux/files_to_delete.txt
      -
        name: Remove Surplus File
        run: |
          rm -f dist/hydrus_client/libxkbcommon.so*
      -
        name: Set Permissions
        run: |
            sudo chown --recursive 1000:1000 dist/hydrus_client
            sudo find dist/hydrus_client -type d -exec chmod 0755 {} \;
            sudo chmod +x dist/hydrus_client/hydrus_client dist/hydrus_client/hydrus_server dist/hydrus_client/bin/swfrender_linux
      -
        name: Compress Client
        run: |
            mv dist/hydrus_client "dist/Hydrus Network"
            tar --zstd -cvf Ubuntu-Extract.tar.zst -C dist "Hydrus Network"
      -
        name: Upload a Build Artifact
        uses: actions/upload-artifact@v3
        with:
          name: Ubuntu-Extract
          path: Ubuntu-Extract.tar.zst
          if-no-files-found: error
          retention-days: 2

  build-windows:
    runs-on: windows-2019
    steps:
      -
        name: Checkout
        uses: actions/checkout@v3
        with:
          path: hydrus
      -
        name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'
          architecture: x64
      -
        name: Pip Install
        run: python3 -m pip install -r hydrus/static/build_files/windows/requirements.txt
      - 
        name: Build docs to /help
        run: mkdocs build -d help
        working-directory: hydrus
      -
        name: Download mpv-dev
        uses: carlosperate/download-file-action@v2
        id: download_mpv
        with:
            file-url: 'https://sourceforge.net/projects/mpv-player-windows/files/libmpv/mpv-dev-x86_64-20230212-git-a40958c.7z'
            file-name: 'mpv-dev-x86_64.7z'
            location: '.'
      -
        name: Process mpv-dev
        run: |
          7z x mpv-dev-x86_64.7z -ompv
          move mpv\libmpv-2.dll hydrus\mpv-2.dll
      -
        name: Download ffmpeg
        uses: carlosperate/download-file-action@v2
        id: download_ffmpeg
        with:
          file-url: 'https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full.7z'
          file-name: 'ffmpeg-release-full.7z'
          location: '.'
      -
        name: Process ffmpeg
        run: |
          7z e ffmpeg-release-full.7z -ohydrus/bin "**/bin/ffmpeg.exe"
      -
        name: Build Hydrus
        run: |
          move hydrus\static\build_files\windows\sqlite3.dll hydrus\
          move hydrus\static\build_files\windows\sqlite3.exe hydrus\db
          move hydrus\static\build_files\windows\file_version_info_maker.py file_version_info_maker.py
          python file_version_info_maker.py ${{ github.ref_name }}
          move hydrus\static\build_files\windows\hydrus_client.spec hydrus_client.spec
          move hydrus\static\build_files\windows\hydrus_server.spec hydrus_server.spec
          pyinstaller hydrus_server.spec
          pyinstaller hydrus_client.spec
          move dist\hydrus_client "dist\Hydrus Network"
      -
        # yo pretty sure we'll need to install this manually once we are on windows server 2022
        # https://github.com/actions/virtual-environments/issues/4856
        name: InnoSetup
        run: |
          move hydrus\static\build_files\windows\InnoSetup.iss InnoSetup.iss
          ISCC.exe InnoSetup.iss /DVersion=${{ github.ref_name }}
      -
        name: Compress Client
        run: |
          cd .\dist
          7z.exe a -tzip -mm=Deflate -mx=5 ..\Windows-Extract.zip 'Hydrus Network'
          cd ..
      -
        name: Upload a Build Artifact
        uses: actions/upload-artifact@v3
        with:
          name: Windows-Install
          path: dist\HydrusInstaller.exe
          if-no-files-found: error
          retention-days: 2
      -
        name: Upload a Build Artifact
        uses: actions/upload-artifact@v3
        with:
          name: Windows-Extract
          path: Windows-Extract.zip
          if-no-files-found: error
          retention-days: 2

  create-release:
    name: Upload to Release
    runs-on: ubuntu-20.04
    needs: [build-windows, build-ubuntu, build-macos]
    steps:
      -
        name: Get All Artifacts
        uses: actions/download-artifact@v3
      - 
        name: Extract Version Metadata
        id: meta
        run: |
          echo "version=${GITHUB_REF##*/}" >> $GITHUB_ENV
          echo "version_short=${GITHUB_REF##*/v}" >> $GITHUB_ENV
      - 
        name: Rename Files
        run: |
          mkdir ubuntu windows
          mv Windows-Install/HydrusInstaller.exe    Hydrus.Network.${{ env.version_short }}.-.Windows.-.Installer.exe
          mv Windows-Extract/Windows-Extract.zip  Hydrus.Network.${{ env.version_short }}.-.Windows.-.Extract.only.zip
          mv Ubuntu-Extract/Ubuntu-Extract.tar.zst Hydrus.Network.${{ env.version_short }}.-.Linux.-.Executable.tar.zst
          mv MacOS-DMG/HydrusNetwork.dmg          Hydrus.Network.${{ env.version_short }}.-.macOS.-.App.dmg
      - 
        name: Upload Files
        uses: softprops/action-gh-release@v1
        if: startsWith(github.ref, 'refs/tags/')
        with:
          files: |
            Hydrus.Network.${{ env.version_short }}.-.Windows.-.Installer.exe
            Hydrus.Network.${{ env.version_short }}.-.Windows.-.Extract.only.zip
            Hydrus.Network.${{ env.version_short }}.-.Linux.-.Executable.tar.zst
            Hydrus.Network.${{ env.version_short }}.-.macOS.-.App.dmg
