package main

import (
	"context"
	"fmt"
	"os"

	"dagger.io/dagger"
)

func main() {
	ctx := context.Background()

	// initialize Dagger client
	client, err := dagger.Connect(ctx, dagger.WithLogOutput(os.Stderr))
	if err != nil {
		panic(err)
	}
	defer client.Close()

	goCache := client.CacheVolume("golang")

	// use a node:16-slim container
	// mount the source code directory on the host
	// at /src in the container
	source := client.Container().
		From("golang:1.25").
		WithDirectory("/src_d", client.Host().Directory(".", dagger.HostDirectoryOpts{
			Exclude: []string{},
		})).WithMountedCache("/src_d/dagger_dep_cache/go_dep", goCache)

	geese := []string{"darwin", "linux", "windows"}
	goarch := "amd64"

	// set the working directory in the container
	// install application dependencies
	runner := source.WithWorkdir("/src_d/src/").
		WithExec([]string{"go", "mod", "tidy"}).WithEnvVariable("CI", "true")

	// run application tests
	test := runner.WithWorkdir("/src_d/src/").WithExec([]string{"go", "test", "./..."}).WithEnvVariable("CI", "true")

	buildDir := test.Directory("/src_d/src/")

	Coco_var := os.Getenv("Coco_Version")


	for _, goos := range geese {
		path := fmt.Sprintf("/dist/")
		filename := fmt.Sprintf("/dist/cocommit-%s", goos)
		// build application
		// write the build output to the host
		build := test.
			WithEnvVariable("GOOS", goos).
			WithEnvVariable("GOARCH", goarch).
			WithExec([]string{"go", "build", "-o", filename, "-ldflags", "-X github.com/Slug-Boi/cocommit/src/cmd.Coco_Version="+Coco_var}).WithEnvVariable("CI", "true")

		buildDir = buildDir.WithDirectory(path, build.Directory(path))

	}

	// extra step to build for aarch on darwin
	path := fmt.Sprintf("/dist/")
	filename := fmt.Sprintf("/dist/cocommit-darwin-aarch64")

	build := test.
		WithEnvVariable("GOOS", "darwin").
		WithEnvVariable("GOARCH", "arm64").
		WithExec([]string{"go", "build", "-o", filename, "-ldflags", "-X github.com/Slug-Boi/cocommit/src/cmd.Coco_Version="+Coco_var}).WithEnvVariable("CI", "true")

	buildDir = buildDir.WithDirectory(path, build.Directory(path))

	_, err = buildDir.Export(ctx, ".")
	if err != nil {
		panic(err)
	}
	e, err := buildDir.Entries(ctx)
	if err != nil {
		panic(err)
	}

	fmt.Printf("build dir contents:\n %s\n", e)
}
