# Copyright 2024, Command Line Inc.
# SPDX-License-Identifier: Apache-2.0

version: "3"

vars:
    APP_NAME: "TheNextWave"
    BIN_DIR: "bin"
    VERSION:
        sh: node version.cjs
    RM: '{{if eq OS "windows"}}cmd --% /c del /S{{else}}rm {{end}}'
    RMRF: '{{if eq OS "windows"}}powershell Remove-Item -Force -Recurse{{else}}rm -rf{{end}}'
    DATE: '{{if eq OS "windows"}}powershell date -UFormat{{else}}date{{end}}'

tasks:
    electron:dev:
        desc: Run the Electron application via the Vite dev server (enables hot reloading).
        cmds:
            - yarn dev
        deps:
            - build:server
            - build:wsh
        env:
            WCLOUD_ENDPOINT: "https://ot2e112zx5.execute-api.us-west-2.amazonaws.com/dev"
            WCLOUD_WS_ENDPOINT: "wss://5lfzlg5crl.execute-api.us-west-2.amazonaws.com/dev/"

    electron:start:
        desc: Run the Electron application directly.
        cmds:
            - yarn start
        deps:
            - build:server
            - build:wsh

    package:
        desc: Package the application for the current platform.
        cmds:
            - cmd: '{{.RMRF}} "make"'
              ignore_error: true
            - yarn build:prod && yarn electron-builder -c electron-builder.config.cjs -p never
        deps:
            - build:server
            - build:wsh

    build:server:
        desc: Build the wavesrv component.
        deps:
            - build:server:darwin
            - build:server:other

    build:server:darwin:
        desc: Build the wavesrv component for Darwin platforms (generates artifacts for both arm64 and amd64).
        status:
            - exit {{if eq OS "darwin"}}1{{else}}0{{end}}
        cmds:
            - cmd: "{{.RM}} dist/bin/wavesrv*"
              ignore_error: true
            - task: build:server:internal
              vars:
                  GOARCH: arm64
            - task: build:server:internal
              vars:
                  GOARCH: amd64

    build:server:other:
        desc: Build the wavesrv component for non-Darwin platforms (only generates artifacts for the current architecture).
        status:
            - exit {{if eq OS "darwin"}}0{{else}}1{{end}}
        cmds:
            - cmd: "{{.RM}} dist/bin/wavesrv*"
              ignore_error: true
            - task: build:server:internal
              vars:
                  GOARCH:
                      sh: echo {{if eq "arm" ARCH}}arm64{{else}}{{ARCH}}{{end}}
                  GO_LDFLAGS: -linkmode 'external' -extldflags=-static

    build:server:internal:
        requires:
            vars:
                - GOARCH
        cmds:
            - CGO_ENABLED=1 GOARCH={{.GOARCH}} go build -tags "osusergo,netgo,sqlite_omit_load_extension" -ldflags "{{.GO_LDFLAGS}} -X main.BuildTime=$({{.DATE}} +'%Y%m%d%H%M') -X main.WaveVersion={{.VERSION}}" -o dist/bin/wavesrv.{{.GOARCH}}{{exeExt}} cmd/server/main-server.go
        sources:
            - "cmd/server/*.go"
            - "pkg/**/*.go"
        generates:
            - dist/bin/wavesrv.{{.GOARCH}}{{exeExt}}
        deps:
            - generate
            - go:mod:tidy
        internal: true

    build:wsh:
        desc: Build the wsh component for all possible targets.
        cmds:
            - cmd: "{{.RM}} dist/bin/wsh*"
              ignore_error: true
            - task: build:wsh:internal
              vars:
                  GOOS: darwin
                  GOARCH: arm64
            - task: build:wsh:internal
              vars:
                  GOOS: darwin
                  GOARCH: amd64
            - task: build:wsh:internal
              vars:
                  GOOS: linux
                  GOARCH: arm64
            - task: build:wsh:internal
              vars:
                  GOOS: linux
                  GOARCH: amd64
            - task: build:wsh:internal
              vars:
                  GOOS: windows
                  GOARCH: amd64
            - task: build:wsh:internal
              vars:
                  GOOS: windows
                  GOARCH: arm64

    dev:installwsh:
        desc: quick shortcut to rebuild wsh and install for macos arm64
        requires:
            vars:
                - VERSION
        cmds:
            - task: build:wsh:internal
              vars:
                  GOOS: darwin
                  GOARCH: arm64
            - cp dist/bin/wsh-{{.VERSION}}-darwin.arm64 ~/.w2-dev/bin/wsh

    build:wsh:internal:
        vars:
            EXT:
                sh: echo {{if eq .GOOS "windows"}}.exe{{end}}
        requires:
            vars:
                - GOOS
                - GOARCH
                - VERSION
        sources:
            - "cmd/wsh/**/*.go"
            - "pkg/**/*.go"
        generates:
            - dist/bin/wsh-{{.VERSION}}-{{.GOOS}}.{{.GOARCH}}{{.EXT}}
        cmds:
            - (CGO_ENABLED=0 GOOS={{.GOOS}} GOARCH={{.GOARCH}} go build -ldflags="-s -w -X main.BuildTime=$({{.DATE}} +'%Y%m%d%H%M') -X main.WaveVersion={{.VERSION}}" -o dist/bin/wsh-{{.VERSION}}-{{.GOOS}}.{{.GOARCH}}{{.EXT}} cmd/wsh/main-wsh.go)
        deps:
            - generate
            - go:mod:tidy
        internal: true

    generate:
        desc: Generate Typescript bindings for the Go backend.
        cmds:
            - go run cmd/generate/main-generate.go
            - go run cmd/generatewshclient/main-generatewshclient.go
        sources:
            - "cmd/generate/*.go"
            - "cmd/generatewshclient/*.go"
            - "pkg/service/**/*.go"
            - "pkg/wconfig/**/*.go"
            - "pkg/wstore/*.go"
            - "pkg/wshrpc/**/*.go"
            - "pkg/tsgen/**/*.go"
            - "pkg/eventbus/eventbus.go"
        generates:
            - frontend/types/gotypes.d.ts
            - pkg/wshrpc/wshclient/wshclient.go
            - frontend/app/store/services.ts
            - frontend/app/store/wshserver.ts

    go:mod:tidy:
        desc: Runs `go mod tidy`
        internal: true
        generates:
            - go.sum
        sources:
            - go.mod
        cmds:
            - go mod tidy