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

// The relnote command works with release notes.
// It can be used to look for unfinished notes and to generate the
// final markdown file.
package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"path/filepath"
	"regexp"
	"runtime"
	"time"
)

var (
	verbose    = flag.Bool("v", false, "print verbose logging")
	goroot     = flag.String("goroot", runtime.GOROOT(), "root of Go repo containing docs")
	todosSince = flag.String("since", "", "earliest to look for TODOs, in YYYY-MM-DD format")
)

func usage() {
	out := flag.CommandLine.Output()
	fmt.Fprintf(out, "usage:\n")
	fmt.Fprintf(out, "   relnote generate\n")
	fmt.Fprintf(out, "      generate release notes from doc/next\n")
	fmt.Fprintf(out, "   relnote todo\n")
	fmt.Fprintf(out, "      report which release notes need to be written\n")
	flag.PrintDefaults()
}

func main() {
	log.SetPrefix("relnote: ")
	log.SetFlags(0)
	flag.Usage = usage
	flag.Parse()

	// Read internal/goversion to find the next release.
	data, err := os.ReadFile(filepath.Join(*goroot, "src/internal/goversion/goversion.go"))
	if err != nil {
		log.Fatal(err)
	}
	m := regexp.MustCompile(`Version = (\d+)`).FindStringSubmatch(string(data))
	if m == nil {
		log.Fatalf("cannot find Version in src/internal/goversion/goversion.go")
	}
	version := m[1]

	// Dispatch to a subcommand if one is provided.
	if cmd := flag.Arg(0); cmd != "" {
		switch cmd {
		case "generate":
			err = generate(version, *goroot)
		case "todo":
			var sinceDate time.Time
			if *todosSince != "" {
				sinceDate, err = time.Parse(time.DateOnly, *todosSince)
				if err != nil {
					log.Fatalf("-since flag: %v", err)
				}
			}
			err = todo(os.Stdout, *goroot, sinceDate)
		default:
			err = fmt.Errorf("unknown command %q", cmd)
		}
		if err != nil {
			log.Fatal(err)
		}
	} else {
		usage()
		log.Fatal("missing subcommand")
	}
}
