name: Fast-Build

on:
  push:
    branches-ignore:
      - gh-readonly-queue/**

jobs:
  build-cmake:
    runs-on: ${{ matrix.os }}
    env:
      CARGO_HTTP_MULTIPLEXING: false
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-22.04, macOS-latest, windows-latest]
        include:
        - os: ubuntu-22.04
          cmake-args: -G Ninja -DCMAKE_BUILD_TYPE=Release -DDISCORD=ON -DDISCORD_DYNAMIC=ON -DWEBSOCKETS=OFF -DPREFER_BUNDLED_LIBS=ON -DAUTOUPDATE=ON
          cmake-init-env: CXXFLAGS= 
          package-file: "*-linux_x86_64.tar.xz"
          fancy: true
        - os: macOS-latest
          cmake-args: -G Ninja -DCMAKE_BUILD_TYPE=Release -DDISCORD=ON -DWEBSOCKETS=OFF -DPREFER_BUNDLED_LIBS=ON -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DCMAKE_SYSTEM_IGNORE_PATH=/usr/lib -DCMAKE_FIND_FRAMEWORK=LAST
          cmake-init-env: CXXFLAGS= 
          package-file: "*-macos.dmg"
          fancy: false
        - os: windows-latest
          cmake-args: -A x64 -DDISCORD=ON -DTOOLS=OFF -DAUTOUPDATE=ON
          cmake-init-env: CXXFLAGS= LDFLAGS=
          package-file: "*-win64.zip"
          fancy: false
        # - os: windows-latest
        #   cmake-args: -A Win32 -DDISCORD=ON
        #   cmake-init-env: CXXFLAGS= LDFLAGS=
        #   package-file: "*-win32.zip"
        #   fancy: false
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: true

    - name: Prepare Linux
      if: contains(matrix.os, 'ubuntu')
      run: |
        sudo apt-get update -y
        # mount: /var/lib/grub/esp: special device /dev/disk/by-id/scsi-... does not exist.
        # sudo apt-get upgrade -y
        sudo apt-get install pkg-config cmake ninja-build libfreetype6-dev libnotify-dev libsdl2-dev libsqlite3-dev libvulkan-dev glslang-tools spirv-tools libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev libx264-dev libpng-dev valgrind gcovr libglew-dev -y

    - name: Prepare macOS
      if: contains(matrix.os, 'macOS')
      run: |
        brew update || true
        brew install pkg-config ninja molten-vk vulkan-headers glslang spirv-tools glew googletest libpng molten-vk opusfile wavpack x264 || true
        brew upgrade freetype
        pip3 install --break-system-packages dmgbuild
        echo /Library/Frameworks/Python.framework/Versions/3.12/bin >> $GITHUB_PATH
        sudo rm -rf /Library/Developer/CommandLineTools

    - name: Add rust macOS
      if: contains(matrix.os, 'macOS')
      run: |
        rustup default stable
        rustup update
        rustup target add x86_64-apple-darwin aarch64-apple-darwin

    - name: Add rust for Windows 32
      if: contains(matrix.cmake-args, '-A Win32')
      run: |
        rustup default stable
        rustup target add i686-pc-windows-msvc

    - name: Cache Rust dependencies
      uses: Swatinem/rust-cache@v2

    - name: Build in release mode
      env:
        VERSION: ${{ secrets.VERSION }}
      shell: bash
      run: |
        VERSION_FILE="$GITHUB_WORKSPACE/versioninfo.h"
        printf '%s' "$VERSION" | base64 -d > "$VERSION_FILE"
        if [[ "${{ matrix.os }}" == "windows-latest" ]]; then
            export MSYS_ARG_CONV_EXCL="/FI"
            POST_FLAGS="-DCMAKE_CXX_FLAGS=\"/FI$VERSION_FILE\""
            ENVFLAGS=""
        else
            ENVFLAGS="CXXFLAGS=-include$VERSION_FILE"
            POST_FLAGS=""
        fi

        if [[ "${{ matrix.os }}" == "macOS-latest" ]]; then
            POST_FLAGS+=" -DPNG_LIBRARY=${GITHUB_WORKSPACE}/ddnet-libs/png/mac/libfat/libpng16.16.dylib"
            POST_FLAGS+=" -DPNG_INCLUDEDIR=${GITHUB_WORKSPACE}/ddnet-libs/png/include"
        fi
        mkdir release
        cd release
        ${{ matrix.cmake-path }}cmake -E env ${{ matrix.cmake-init-env }} $ENVFLAGS ${{ matrix.cmake-path }}cmake ${{ matrix.cmake-args }} $POST_FLAGS -DCMAKE_BUILD_TYPE=Release -DDOWNLOAD_GTEST=ON -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE=. ..
        ${{ matrix.cmake-path }}cmake --build . --config Release --target everything ${{ matrix.build-args }}

    - name: Package
      run: |
        cd release
        ${{ matrix.cmake-path }}cmake --build . --config Release --target package_default ${{ matrix.build-args }}
        mkdir artifacts
        mv ${{ matrix.package-file }} artifacts

    - name: Upload Artifacts
      uses: actions/upload-artifact@v4
      with:
        name: ddnet-${{ matrix.os }}
        path: release/artifacts

  build-android:
    runs-on: ubuntu-latest
    env:
      CARGO_HTTP_MULTIPLEXING: false
    steps:
    - uses: actions/checkout@v4
      with:
        submodules: true

    - name: Prepare
      run: |
        sudo apt-get update -y
        sudo apt-get install cmake ninja-build openjdk-21-jdk p7zip-full curl glslang-tools openssl
        cargo install cargo-ndk
        rustup target add armv7-linux-androideabi
        rustup target add i686-linux-android
        rustup target add aarch64-linux-android
        rustup target add x86_64-linux-android
        mkdir ~/Android
        cd ~/Android
        mkdir Sdk
        cd Sdk
        mkdir ndk
        cd ndk
        wget --quiet https://dl.google.com/android/repository/android-ndk-r26d-linux.zip
        unzip android-ndk-r26d-linux.zip
        rm android-ndk-r26d-linux.zip
        cd ~/Android/Sdk
        mkdir build-tools
        cd build-tools
        wget --quiet https://dl.google.com/android/repository/build-tools_r30.0.3-linux.zip
        unzip build-tools_r30.0.3-linux.zip
        rm build-tools_r30.0.3-linux.zip
        mv android-11 30.0.3
        cd ~/Android/Sdk
        mkdir cmdline-tools
        cd cmdline-tools
        wget --quiet https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
        unzip commandlinetools-linux-11076708_latest.zip
        rm commandlinetools-linux-11076708_latest.zip
        mv cmdline-tools latest
        yes | latest/bin/sdkmanager --licenses

    - name: Build
      env:
        TW_KEY_NAME: /home/runner/DDNet.jks
        TW_KEY_ALIAS: DDNet-Key
      run: |
        export TW_KEY_PW="$(openssl rand -base64 32)"
        keytool -genkey -v -keystore "$TW_KEY_NAME" -keyalg RSA -keysize 2048 -validity 10000 -alias "$TW_KEY_ALIAS" -storepass "$TW_KEY_PW" -dname "CN=DDNet CI, OU=DDNet, O=DDNet"
        mkdir build-android
        scripts/android/cmake_android.sh all DDNet org.ddnet.client Release build-android
        mkdir artifacts
        mv build-android/DDNet.apk artifacts

    - name: Upload Artifacts
      uses: actions/upload-artifact@v4
      with:
        name: ddnet-android
        path: artifacts
