// Heavily inspired (copied) by the restic build file
// https://github.com/restic/restic/blob/aa0faa8c7d7800b6ba7b11164fa2d3683f7f78aa/helpers/build-release-binaries/main.go#L225

package main

import (
	"fmt"
	"os"
	"os/exec"
	"path"
	"path/filepath"
	"sync"

	"github.com/cupcakearmy/autorestic/internal"
)

var DIR, _ = filepath.Abs("./dist")

var targets = map[string][]string{
	"darwin":  {"amd64", "arm64"},
	"freebsd": {"386", "amd64", "arm"},
	"linux":   {"386", "amd64", "arm", "arm64"},
	"netbsd":  {"386", "amd64"},
	"openbsd": {"386", "amd64"},
}

type buildOptions struct {
	Target, Arch, Version string
}

func build(options buildOptions, wg *sync.WaitGroup) {
	fmt.Printf("Building %s %s\n", options.Target, options.Arch)
	out := fmt.Sprintf("autorestic_%s_%s_%s", options.Version, options.Target, options.Arch)
	out = path.Join(DIR, out)
	out, _ = filepath.Abs(out)
	fmt.Println(out)

	// Build
	{
		c := exec.Command("go", "build", "-o", out, "./main.go")
		c.Stdout = os.Stdout
		c.Stderr = os.Stderr
		c.Env = append(os.Environ(),
			"CGO_ENABLED=0",
			"GOOS="+options.Target,
			"GOARCH="+options.Arch,
		)
		err := c.Run()
		if err != nil {
			panic(err)
		}
	}

	// Compress
	{
		c := exec.Command("bzip2", out)
		c.Dir = DIR
		c.Stdout = os.Stdout
		c.Stderr = os.Stderr
		err := c.Run()
		if err != nil {
			panic(err)
		}
	}
	wg.Done()
}

func main() {
	os.RemoveAll(DIR)
	v := internal.VERSION
	var wg sync.WaitGroup
	for target, archs := range targets {
		for _, arch := range archs {
			wg.Add(1)
			build(buildOptions{
				Target:  target,
				Arch:    arch,
				Version: v,
			}, &wg)
		}
	}
	wg.Wait()
}