app := "restray"
version := `grep 'const version' cmd/restray/main.go | cut -d'"' -f2`
bin := "bin"
dist := "dist"
pkg := "cmd/restray"

icons:
    #!/usr/bin/env bash
    set -e
    tmp=$(mktemp -d)
    trap 'rm -rf "$tmp"' EXIT
    out="{{pkg}}/icons/generated"
    rm -rf "$out"
    mkdir -p "$out"
    for sheet in idle busy fail download; do
        src="{{pkg}}/icons/$sheet.png"
        [ -f "$src" ] || continue
        dims=$(magick identify -format "%w %h" "$src")
        w=${dims% *}
        sz=${dims#* }
        cols=$((w / sz))
        for ((i=0; i<cols; i++)); do
            x=$((i * sz))
            n=$(printf "%02d" "$i")
            magick "$src" -crop "${sz}x${sz}+${x}+0" +repage "$tmp/frame.png"
            cp "$tmp/frame.png" "$out/linux-${sheet}-${n}.png"
            magick "$tmp/frame.png" -alpha extract -background black -alpha shape "$out/macos-${sheet}-${n}.png"
            magick "$tmp/frame.png" -define icon:auto-resize=64,48,32,16 "$out/windows-${sheet}-${n}.ico"
        done
    done
    # Last idle frame = app icon for packaging
    last=$(find "$out" -name "linux-idle-*.png" 2>/dev/null | sort | tail -1)
    if [ -n "$last" ]; then
        cp "$last" packaging/linux/restray.png
        magick "$last" -define icon:auto-resize=256,128,64,48,32,16 packaging/windows/restray.ico
        go run github.com/tc-hib/go-winres@latest simply --icon packaging/windows/restray.ico --out packaging/windows/restray
        rm -f packaging/windows/restray_windows_386.syso
        sizes=""
        for size in 16 32 128 256 512; do
            magick "$last" -resize ${size}x${size} "$tmp/restray-${size}.png"
            sizes="$sizes $tmp/restray-${size}.png"
        done
        png2icns packaging/darwin/restray.icns $sizes
    fi

build target="" arch="":
    #!/usr/bin/env bash
    zig_arch() {
        case "$1" in
            amd64) echo "x86_64" ;;
            arm64) echo "aarch64" ;;
            *)     echo "$1" ;;
        esac
    }
    build_one() {
        local os=$1 arch=$2 za
        za=$(zig_arch "$arch")
        case "$os" in
            darwin)
                export CGO_CFLAGS="-mmacosx-version-min=11.0"
                export CGO_LDFLAGS="-mmacosx-version-min=11.0"
                GOOS=darwin GOARCH=$arch go build -o {{bin}}/{{app}}-{{version}}-darwin-$arch ./{{pkg}} ;;
            linux)
                CGO_ENABLED=1 CC="zig cc -target ${za}-linux-gnu" \
                GOOS=linux GOARCH=$arch go build -o {{bin}}/{{app}}-{{version}}-linux-$arch ./{{pkg}} ;;
            windows)
                cp -f packaging/windows/restray_windows_${arch}.syso {{pkg}}/ 2>/dev/null || true
                CGO_ENABLED=1 CC="zig cc -target ${za}-windows-gnu" \
                GOOS=windows GOARCH=$arch go build -ldflags -H=windowsgui -o {{bin}}/{{app}}-{{version}}-windows-$arch.exe ./{{pkg}}
                rm -f {{pkg}}/restray_windows_${arch}.syso ;;
        esac
    }
    build_os() {
        local os=$1
        if [ -n "{{arch}}" ]; then build_one "$os" "{{arch}}"
        else build_one "$os" amd64 && build_one "$os" arm64; fi
    }
    case "{{target}}" in
        darwin|linux|windows) build_os "{{target}}" ;;
        all) build_os darwin && build_os linux && build_os windows ;;
        "") build_one "$(go env GOOS)" "$(go env GOARCH)" ;;
        *) echo "Unknown target: {{target}}. Use: darwin, linux, windows, all" && exit 1 ;;
    esac

package target="" arch="":
    #!/usr/bin/env bash
    package_one() {
        local os=$1 arch=$2
        just build "$os" "$arch" && just "_package-$os" "$arch"
    }
    package_os() {
        local os=$1
        if [ -n "{{arch}}" ]; then package_one "$os" "{{arch}}"
        else package_one "$os" amd64 && package_one "$os" arm64; fi
    }
    case "{{target}}" in
        darwin|linux|windows) package_os "{{target}}" ;;
        all) package_os darwin && package_os windows && package_os linux ;;
        "")
            case "$(uname)" in
                Darwin)       package_os darwin ;;
                MINGW*|MSYS*) package_os windows ;;
                *)            package_os linux ;;
            esac ;;
        *) echo "Unknown target: {{target}}. Use: darwin, windows, linux, all" && exit 1 ;;
    esac

_package-darwin arch:
    rm -rf {{dist}}/Restray.app
    mkdir -p {{dist}}/Restray.app/Contents/MacOS {{dist}}/Restray.app/Contents/Resources
    cp {{bin}}/{{app}}-{{version}}-darwin-{{arch}} {{dist}}/Restray.app/Contents/MacOS/Restray
    cp packaging/darwin/Info.plist {{dist}}/Restray.app/Contents/Info.plist
    cp packaging/darwin/restray.icns {{dist}}/Restray.app/Contents/Resources/restray.icns
    cd {{dist}} && zip -r {{app}}-{{version}}-darwin-{{arch}}.zip Restray.app
    rm -rf {{dist}}/Restray.app

_package-windows arch:
    mkdir -p {{dist}}
    cp {{bin}}/{{app}}-{{version}}-windows-{{arch}}.exe {{bin}}/{{app}}.exe
    makensis -DARCH={{arch}} packaging/windows/installer.nsi
    rm {{bin}}/{{app}}.exe

_package-linux arch:
    mkdir -p {{dist}}
    OUTPUT={{dist}}/{{app}}-{{version}}-linux-{{arch}}.AppImage linuxdeploy \
        --executable={{bin}}/{{app}}-{{version}}-linux-{{arch}} \
        --desktop-file=packaging/linux/restray.desktop \
        --icon-file=packaging/linux/restray.png \
        --output=appimage

run:
    just build && {{bin}}/{{app}}-{{version}}-$(go env GOOS)-$(go env GOARCH)

lint:
    goimports -w {{pkg}}
    go vet ./{{pkg}}
    staticcheck ./{{pkg}}

bump new:
    #!/usr/bin/env bash
    set -euo pipefail
    [[ "{{new}}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || { echo "Usage: just bump X.Y.Z"; exit 1; }
    perl -pi -e 's/^const version = ".*"/const version = "{{new}}"/' {{pkg}}/main.go
    perl -pi -e 's/version = ".*"/version = "{{new}}"/' flake.nix
    perl -pi -e 's/!define VERSION ".*"/!define VERSION "{{new}}"/' packaging/windows/installer.nsi
    perl -pi -e 's|(<string>)[^<]*(</string>)|${1}{{new}}${2}| if $prev =~ /CFBundle(Version|ShortVersionString)/; $prev = $_' packaging/darwin/Info.plist
    echo "Bumped to {{new}}"
    grep -n "{{new}}" {{pkg}}/main.go flake.nix packaging/windows/installer.nsi packaging/darwin/Info.plist

clean:
    rm -rf {{bin}} {{dist}} result
