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

// Package gitauth writes gitcookies files so git will authenticate
// to Gerrit as gopherbot for quota purposes.
package gitauth

import (
	"bytes"
	"context"
	"fmt"
	"log"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
	"time"

	"cloud.google.com/go/compute/metadata"
	"golang.org/x/build/internal/secret"
)

func Init() error {
	cookieFile := filepath.Join(homeDir(), ".gitcookies")
	if err := exec.Command("git", "config", "--global", "http.cookiefile", cookieFile).Run(); err != nil {
		return fmt.Errorf("running git config to set cookiefile: %v", err)
	}
	if !metadata.OnGCE() {
		// Do nothing for now.
		return nil
	}

	sc := secret.MustNewClient()
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	slurp, err := sc.Retrieve(ctx, secret.NameGobotPassword)
	if err != nil {
		proj, _ := metadata.ProjectID()
		if proj != "symbolic-datum-552" { // TODO: don't hard-code this; use buildenv package
			log.Printf("gitauth: ignoring %q secret manager lookup on non-prod project: %v", secret.NameGobotPassword, err)
			return nil
		}
		return fmt.Errorf("gitauth: getting %s secret manager: %v", secret.NameGobotPassword, err)
	}
	slurp = strings.TrimSpace(slurp)
	var buf bytes.Buffer
	fmt.Fprintf(&buf, "go.googlesource.com\tFALSE\t/\tTRUE\t2147483647\to\tgit-gobot.gmail.com=%s\n", slurp)
	fmt.Fprintf(&buf, "go-review.googlesource.com\tFALSE\t/\tTRUE\t2147483647\to\tgit-gobot.gmail.com=%s\n", slurp)
	return os.WriteFile(cookieFile, buf.Bytes(), 0644)
}

func homeDir() string {
	if h := os.Getenv("HOME"); h != "" {
		return h
	}
	log.Fatalf("No HOME set in environment.")
	panic("unreachable")
}
