// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

//go:build ignore

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"log"
	"os"
	"os/exec"
	"strings"
)

func main() {
	for _, goos := range []string{"windows", "linux", "darwin", "freebsd", "openbsd"} {
		generate(goos)
	}
}

func generate(goos string) {
	var x struct {
		Imports []string
	}
	cmd := exec.Command("go", "list", "-json", "tailscale.com/cmd/tailscaled")
	cmd.Env = append(os.Environ(), "GOOS="+goos, "GOARCH=amd64")
	j, err := cmd.Output()
	if err != nil {
		log.Fatalf("GOOS=%s GOARCH=amd64 %s: %v", goos, cmd, err)
	}
	if err := json.Unmarshal(j, &x); err != nil {
		log.Fatal(err)
	}
	var out bytes.Buffer
	out.WriteString(`// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

// Code generated by gen_deps.go; DO NOT EDIT.

package integration

import (
	// And depend on a bunch of tailscaled innards, for Go's test caching.
	// Otherwise cmd/go never sees that we depend on these packages'
	// transitive deps when we run "go install tailscaled" in a child
	// process and can cache a prior success when a dependency changes.
`)
	for _, dep := range x.Imports {
		if !strings.Contains(dep, ".") {
			// Omit standard library deps.
			continue
		}
		fmt.Fprintf(&out, "\t_ %q\n", dep)
	}
	fmt.Fprintf(&out, ")\n")

	filename := fmt.Sprintf("tailscaled_deps_test_%s.go", goos)
	err = os.WriteFile(filename, out.Bytes(), 0644)
	if err != nil {
		log.Fatal(err)
	}
}
