set unstable
set lists
set quiet
set default-list

_ADDONS := "addons"
_SOURCES := "sources"
_WINDOWS := "windows"
_MACOS := "macos"
_LINUX := "linux"
_FUSED := "bare"

luals_addons() := split(read("addons/luals-addons.txt"))
extra_files() := ["dist/info.md"]

game_name() := trim(shell('cat "$1" | grep "window.title" | cut -d"=" -f2 | tr -d \"', justfile_dir() / 'conf.lua'))
game_version() := trim(shell('cat "$1" | grep "version" | cut -d"=" -f2 | tr -d \"', justfile_dir() / 'conf.lua'))

LOVR_VERSION := "0.19.0"
LOVR_IDENTIFIER := "com.cerisetalis"

lovr_version() := LOVR_VERSION
cfbundle_identifier() := LOVR_IDENTIFIER

build_dir() := "/tmp/good-fracking"

releasename(osname, version) := "good-fracking-" + version + "." + osname + ".zip"
releasepath(osname, version) := justfile_dir() / "releases" / releasename(osname, version)
lovr-releasepath(version) := justfile_dir() / "releases" / ("good-fracking-" + version + ".lovr")

[private]
[working-directory(_ADDONS)]
addon-install-do depline:
    #!/bin/bash
    declare -a depline
    depline=({{ quote(split(depline, '=')) }}); modname="${depline[0]}"; zipurl="${depline[1]}";

    if [[ "z${modname}" == 'z' ]]; then exit 0; fi
    if [[ "z${zipurl} }}" == 'z' ]]; then
      echo 'No zip url provided for' "$modname"
      exit 1
    fi

    if [ -d "$modname" ]; then
        rm -rf "./$modname/"
    fi

    echo "Installing ${modname} from ${zipurl}..."

    wget --quiet -O "$modname.zip" "$zipurl"
    unzip -q "$modname.zip"
    mv ./$modname-* ./$modname
    rm "$modname.zip"

[private]
_luals-addons addons=luals_addons(): *(addon-install-do *addons)

[doc("install addons for lua-ls to provide additional type hints")]
[group("development")]
luals-addons: _luals-addons

[private]
_clean subdir:
    rm -rf {{ build_dir() / subdir }}
    mkdir -p {{ build_dir() / subdir }}

[group("packaging")]
[working-directory(build_dir() / _FUSED)]
build-lovr version: (_clean _FUSED)
    cp --dereference -r "{{ justfile_dir() }}"/*.lua "{{ justfile_dir() }}"/assets "{{ justfile_dir() }}"/lua ./
    zip -qr release-lovr.zip *.lua assets lua 1>/dev/null
    mv release-lovr.zip "{{ lovr-releasepath(version) }}"
    echo '[fused > info]' Created fused lovr package at "releases/$(basename "{{ lovr-releasepath(version) }}")"

[group("packaging")]
[private]
[working-directory(build_dir() / osname)]
prepare-build-dir osname version: (_clean osname)
    for extra in {{ extra_files() }} dist; do cp -r "{{ justfile_dir() }}"/$extra ./; done
    cp "{{ lovr-releasepath(version) }}" project.lovr

[group("packaging")]
[working-directory(build_dir() / _WINDOWS)]
build-windows version: (prepare-build-dir _WINDOWS version)
    wget --quiet -O lovr.windows.zip https://github.com/bjornbytes/lovr/releases/download/v{{ lovr_version() }}/lovr-v{{ lovr_version() }}-win64.zip
    unzip -q lovr.windows.zip -d lovr
    mv dist/Good-Fracking.cmd Good-Fracking.cmd
    zip -qr release-windows.zip lovr project.lovr Good-Fracking.cmd 
    zip -quj release-windows.zip {{ extra_files() }}
    cp release-windows.zip "{{ releasepath(_WINDOWS, version) }}"
    echo "[windows > info] Created Windows package at releases/{{ releasename(_WINDOWS, version) }}"

[group("packaging")]
[working-directory(build_dir() / _LINUX)]
build-linux version: (prepare-build-dir _LINUX version)
    wget --quiet -O lovr.AppImage https://github.com/bjornbytes/lovr/releases/download/v{{ lovr_version() }}/lovr-v{{ lovr_version() }}-x86_64.AppImage
    chmod +x lovr.AppImage

    mv dist/Good-Fracking.sh Good-Fracking
    chmod +x Good-Fracking

    mkdir -p lovr
    mv lovr.AppImage lovr/

    zip -qr release-linux.zip lovr conf.lua project.lovr Good-Fracking 
    zip -quj release-linux.zip {{ extra_files() }} 1>/dev/null
    cp release-linux.zip "{{ releasepath(_LINUX, version) }}"

    echo "[linux > info] Created Linux package at releases/{{ releasename(_LINUX, version) }}"

[group("packaging")]
[working-directory(build_dir() / _MACOS)]
build-macos version: (prepare-build-dir _MACOS version)
    wget --quiet -O lovr.app.zip https://github.com/bjornbytes/lovr/releases/download/v{{ lovr_version() }}/lovr-v{{ lovr_version() }}.app.zip

    unzip -q lovr.app.zip
    unzip -q lovr.zip

    mv project.lovr lovr.app/Contents/Resources/nogame.lovr
    cp "{{ justfile_dir() }}/assets/icons/icon.icns" lovr.app/Contents/Resources/lovr.icns
    chmod +x lovr.app/Contents/MacOS/lovr

    sed -e 's/LÖVR/{{ game_name() }} {{ version }}/' \
        -e 's/org.lovr/{{ cfbundle_identifier() }}/' \
        -e 's/v{{ lovr_version() }}/v{{ version }}/' \
        -i .bak lovr.app/Contents/Info.plist
    rm -f lovr.app/Contents/Info.plist.bak

    if which -s xattr; then \
      echo '[macos > info] Cleared com.apple.quarantine flags from app bundle'; \
      xattr -rd com.apple.quarantine lovr.app; \
    else \
      echo '[macos > warn] Could not find `xattr` executable, cannot attempt to clear com.apple.quarantine flags from app bundle'; \
    fi

    mv lovr.app "{{ game_name() }}.app"
    zip -qr release-macos.zip "{{ game_name() }}.app"
    zip -quj release-macos.zip {{ extra_files() }}
    cp release-macos.zip "{{ releasepath(_MACOS, version) }}"

    echo "[macos > info] Created MacOS package at releases/{{ releasename(_MACOS, version) }}"

[parallel]
[private]
build-distros version: (build-macos version) (build-windows version) (build-linux version)

[doc("generate release packages for all supported operating systems")]
[group("packaging")]
build version=game_version(): (build-lovr version) (build-distros version)

[doc("remove all build files from build directories")]
[group("packaging")]
clean: (_clean "")

_sources := ["lua", "dist", "assets", "working", "*.lua", "*.md", "Justfile", "*.json", "*.toml", "addons/luals-addons.txt"]

[private]
source-release version:
    zip -qru releases/{{ releasename(_SOURCES, version) }} {{ _sources }}
    echo "[sources > info] Created source package at releases/{{ releasename(_SOURCES, version) }}"

[doc("prepare all release packages for a release")]
[group("packaging")]
[parallel]
release version=game_version(): (build version) (source-release version)
