// Copyright 2021 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 task

import (
	"bytes"
	"fmt"
	"go/format"
	"path"
	"strings"
	"text/template"
	"time"

	"golang.org/x/build/gerrit"
	"golang.org/x/build/internal/workflow"
)

// MailDLCL mails a golang.org/dl CL that adds commands for the
// specified Go version.
//
// The version string must use the same format as Go tags. For example:
//   - "go1.21rc2" for a pre-release
//   - "go1.21.0" for a major Go release
//   - "go1.21.1" for a minor Go release
//
// On success, the ID of the change is returned, like "dl~1234".
func (t *VersionTasks) MailDLCL(ctx *workflow.TaskContext, major int, kind ReleaseKind, version string, reviewers []string, dryRun bool) (changeID string, _ error) {
	var files = make(map[string]string) // Map key is relative path, and map value is file content.

	// Generate main.go files for versions from the template.
	var buf bytes.Buffer
	if err := dlTmpl.Execute(&buf, struct {
		Year    int
		Version string // "go1.21rc2"
		DocLink string // "https://go.dev/doc/go1.21"
	}{
		Year:    time.Now().UTC().Year(),
		Version: version,
		DocLink: docLink(major, kind, version),
	}); err != nil {
		return "", fmt.Errorf("dlTmpl.Execute: %v", err)
	}
	gofmted, err := format.Source(buf.Bytes())
	if err != nil {
		return "", fmt.Errorf("could not gofmt: %v", err)
	}
	files[path.Join(version, "main.go")] = string(gofmted)
	ctx.Printf("file %q (command %q):\n%s", path.Join(version, "main.go"), "golang.org/dl/"+version, gofmted)

	// Create a Gerrit CL using the Gerrit API.
	if dryRun {
		return "(dry-run)", nil
	}
	changeInput := gerrit.ChangeInput{
		Project: "dl",
		Subject: "dl: add " + version,
		Branch:  "master",
	}
	return t.Gerrit.CreateAutoSubmitChange(ctx, changeInput, reviewers, files)
}

func docLink(major int, kind ReleaseKind, ver string) string {
	if kind == KindCurrentMinor || kind == KindPrevMinor {
		return fmt.Sprintf("https://go.dev/doc/devel/release#%v", ver)
	}

	host := "go.dev"
	if kind == KindBeta || kind == KindRC {
		host = "tip.golang.org"
	}
	return fmt.Sprintf("https://%v/doc/go1.%d", host, major)
}

var dlTmpl = template.Must(template.New("").Funcs(template.FuncMap{
	"short": func(v string) string { return strings.TrimPrefix(v, "go") },
}).Parse(`// Copyright {{.Year}} 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.

// The {{.Version}} command runs the go command from Go {{.Version|short}}.
//
// To install, run:
//
//	$ go install golang.org/dl/{{.Version}}@latest
//	$ {{.Version}} download
//
// And then use the {{.Version}} command as if it were your normal go
// command.
//
// See the release notes at {{.DocLink}}.
//
// File bugs at https://go.dev/issue/new.
package main

import "golang.org/dl/internal/version"

func main() {
	version.Run("{{.Version}}")
}
`))
