// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// The makefuchsia.go script builds a GOROOT in the out/ build directory
// using sources from third_party/go.
package main

import (
	"bytes"
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
	"time"
)

var (
	flagBootstrapGoroot = flag.String("bootstrap-goroot", "", "Path to go root used for bootstrap")
	flagGoroot          = flag.String("goroot", "", "Path to the output GOROOT")

	flagDepfilePath   = flag.String("depfile", "", "depfile to write into")
	flagDepfileTarget = flag.String("depfile-target", "", "depfile `make` target")
	flagDepfileRoot   = flag.String("depfile-root", "", "Path from which dependency paths should be rooted")

	flagStampPath = flag.String("stamp-file", "", "Path of a file to create upon completion")
)

func join(path ...string) string { return filepath.Join(path...) }

func main() {
	log.SetFlags(0)
	log.SetPrefix("makefuchsia.go: ")
	flag.Parse()

	versionFile := join(*flagGoroot, "VERSION")
	origVersion, err := ioutil.ReadFile(versionFile)
	if err != nil {
		log.Fatal(err)
	}

	// Do not repeat the updating of the VERSION file if it was previously performed.
	if bytes.Index(origVersion, []byte("fuchsia")) == -1 {
		if err := ioutil.WriteFile(versionFile, []byte(fmt.Sprintf("devel(%s) third_party/go fuchsia", bytes.TrimSpace(origVersion))), os.ModePerm); err != nil {
			log.Fatal(err)
		}
	}

	env := os.Environ()
	if *flagBootstrapGoroot == "" {
		log.Fatal("-bootstrap-goroot is required")
	}
	env = append(env, "GOROOT_BOOTSTRAP="+strings.TrimSpace(*flagBootstrapGoroot))

	abs, err := filepath.Abs(join(*flagGoroot, "src", "make.bash"))
	if err != nil {
		log.Fatal(err)
	}
	cmd := exec.Command(abs, "--no-clean")
	cmd.Dir = join(*flagGoroot, "src")
	cmd.Env = env
	buf := new(bytes.Buffer)
	cmd.Stdout = buf
	cmd.Stderr = buf
	if err := cmd.Run(); err != nil {
		log.Fatalf("make.bash failed: %v\n%s", err, buf.String())
	}

	depfile, err := os.Create(*flagDepfilePath)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Fprintf(depfile, "%s:", *flagStampPath)

	if err := filepath.Walk(*flagGoroot, func(path string, info os.FileInfo, err error) error {
		if err != nil || info.IsDir() {
			return err
		}
		fmt.Fprintf(depfile, " %s", path)
		return err
	}); err != nil {
		log.Fatal(err)
	}

	fmt.Fprint(depfile, "\n")

	if err := ioutil.WriteFile(*flagStampPath, []byte(fmt.Sprintf("%s", time.Now())), os.ModePerm); err != nil {
		log.Fatal(err)
	}
}
