// 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 (
	"bytes"
	"errors"
	"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.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, "-index", "-index_interval=-1s", "-play")
	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
}

var indexingMsg = []byte("Indexing in progress: result may be inaccurate")

func (b golangorgBuilder) HealthCheck(hostport string) error {
	body, err := getOK(fmt.Sprintf("http://%v/search?q=FALLTHROUGH", hostport))
	if err != nil {
		return err
	}
	if bytes.Contains(body, indexingMsg) {
		return errors.New("still indexing")
	}
	return nil
}
