// Copyright 2017 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.

// +build ignore

// The update-readmes.go tool creates or updates README.md files in
// the golang.org/x/build tree. It only updates files if they are
// missing or were previously generated by this tool.
//
// The auto-generated Markdown contains the package doc synopsis
// and a link to godoc.org for the API reference.
package main

import (
	"bytes"
	"fmt"
	"go/build"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	root, err := build.Import("golang.org/x/build", "", build.FindOnly)
	if err != nil {
		log.Fatalf("failed to find golang.org/x/build root: %v", err)
	}
	err = filepath.Walk(root.Dir, func(path string, fi os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if !fi.IsDir() {
			return nil
		}
		rest := strings.TrimPrefix(strings.TrimPrefix(path, root.Dir), "/")
		switch rest {
		case "env", "version", "vendor":
			return filepath.SkipDir
		}
		pkgName := "golang.org/x/build/" + filepath.ToSlash(rest)

		pkg, err := build.Import(pkgName, "", 0)
		if err != nil {
			// Skip.
			return nil
		}
		if pkg.Doc == "" {
			// There's no package comment, so don't create an empty README.
			return nil
		}
		if _, err := os.Stat(filepath.Join(pkg.Dir, "README")); err == nil {
			// Directory has exiting README; don't touch.
			return nil
		}
		readmePath := filepath.Join(pkg.Dir, "README.md")
		exist, err := ioutil.ReadFile(readmePath)
		if err != nil && !os.IsNotExist(err) {
			// A real error.
			return err
		}
		const header = "Auto-generated by x/build/update-readmes.go"
		if len(exist) > 0 && !bytes.Contains(exist, []byte(header)) {
			return nil
		}
		newContents := []byte(fmt.Sprintf(`<!-- %s -->

[![Go Reference](https://pkg.go.dev/badge/%s.svg)](https://pkg.go.dev/%s)

# %s

%s
`, header, pkgName, pkgName, pkgName, pkg.Doc))
		if bytes.Equal(exist, newContents) {
			return nil
		}
		if err := ioutil.WriteFile(readmePath, newContents, 0644); err != nil {
			return err
		}
		log.Printf("Wrote %s", readmePath)
		return nil
	})
	if err != nil {
		log.Fatal(err)
	}
}
