// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.

package main

import (
	"fmt"
	"io"
	"log"
	"os"
	"os/exec"
	"path/filepath"
)

type golangorgBuilder struct{}

func prefix8(s string) string {
	if len(s) < 8 {
		return s
	}
	return s[:8]
}

func (b golangorgBuilder) Signature(heads map[string]string) string {
	return fmt.Sprintf("go=%v/website=%v", prefix8(heads["go"]), prefix8(heads["website"]))
}

func (b golangorgBuilder) Init(logger *log.Logger, dir, hostport string, heads map[string]string) (*exec.Cmd, error) {
	if _, ok := heads["go"]; !ok {
		return nil, fmt.Errorf("missing HEAD revision for 'go' repo")
	}
	if _, ok := heads["website"]; !ok {
		return nil, fmt.Errorf("missing HEAD revision for 'website' repo")
	}
	goDir := filepath.Join(dir, "go")
	websiteDir := filepath.Join(dir, "website")
	logger.Printf("checking out go repo ...")
	if err := checkout(repoURL+"go", heads["go"], goDir); err != nil {
		return nil, fmt.Errorf("checkout of go: %v", err)
	}
	logger.Printf("checking out website repo ...")
	if err := checkout(repoURL+"website", heads["website"], websiteDir); err != nil {
		return nil, fmt.Errorf("checkout of website: %v", err)
	}

	var logWriter io.Writer = toLoggerWriter{logger}

	make := exec.Command(filepath.Join(goDir, "src/make.bash"))
	make.Dir = filepath.Join(goDir, "src")
	make.Stdout = logWriter
	make.Stderr = logWriter
	logger.Printf("running make.bash in %s ...", make.Dir)
	if err := make.Run(); err != nil {
		return nil, fmt.Errorf("running make.bash: %v", err)
	}

	logger.Printf("installing golangorg ...")
	goBin := filepath.Join(goDir, "bin/go")
	binDir := filepath.Join(dir, "bin")
	install := exec.Command(goBin, "install", "golang.org/x/website/cmd/golangorg")
	install.Stdout = logWriter
	install.Stderr = logWriter
	install.Dir = websiteDir
	install.Env = append(os.Environ(),
		"GOROOT="+goDir,
		"GO111MODULE=on",
		"GOPROXY=https://proxy.golang.org",
		"GOBIN="+binDir,
	)
	if err := install.Run(); err != nil {
		return nil, fmt.Errorf("go install golang.org/x/website/cmd/golangorg: %v", err)
	}

	logger.Printf("starting golangorg ...")
	golangorgBin := filepath.Join(binDir, "golangorg")
	golangorg := exec.Command(golangorgBin, "-http="+hostport)
	golangorg.Env = append(os.Environ(), "GOROOT="+goDir)
	golangorg.Stdout = logWriter
	golangorg.Stderr = logWriter
	if err := golangorg.Start(); err != nil {
		return nil, fmt.Errorf("starting golangorg: %v", err)
	}
	return golangorg, nil
}

func (b golangorgBuilder) HealthCheck(hostport string) error {
	_, err := getOK(fmt.Sprintf("http://%v/pkg/fmt", hostport))
	return err
}
