//go:generate go run -mod=vendor git.rootprojects.org/root/go-gitver

package main

import (
	"bytes"
	"fmt"
	"go/format"
	"log"
	"os"
	"text/template"
	"time"

	"git.rootprojects.org/root/go-gitver/gitver"
)

var GitRev, GitVersion, GitTimestamp string
var exitCode int
var verFile = "xversion.go"

func main() {
	pkg := "main"

	args := os.Args[1:]
	for i := range args {
		arg := args[i]
		if "-f" == arg || "--fail" == arg {
			exitCode = 1
		} else if ("--outfile" == arg || "-o" == arg) && len(args) > i+1 {
			verFile = args[i+1]
			args[i+1] = ""
		} else if "--package" == arg && len(args) > i+1 {
			pkg = args[i+1]
			args[i+1] = ""
		} else if "-V" == arg || "version" == arg || "-version" == arg || "--version" == arg {
			fmt.Println(GitRev)
			fmt.Println(GitVersion)
			fmt.Println(GitTimestamp)
			os.Exit(0)
		}
	}
	if "" != os.Getenv("GITVER_FAIL") && "false" != os.Getenv("GITVER_FAIL") {
		exitCode = 1
	}

	v, err := gitver.ExecAndParse()
	if nil != err {
		log.Fatalf("Failed to get git version: %s\n", err)
		os.Exit(exitCode)
	}

	// Create or overwrite the go file from template
	var buf bytes.Buffer
	if err := versionTpl.Execute(&buf, struct {
		Package   string
		Timestamp string
		Version   string
		GitRev    string
	}{
		Package:   pkg,
		Timestamp: v.Timestamp.Format(time.RFC3339),
		Version:   v.Version,
		GitRev:    v.Rev,
	}); nil != err {
		panic(err)
	}

	// Format
	src, err := format.Source(buf.Bytes())
	if nil != err {
		panic(err)
	}

	// Write to disk (in the Current Working Directory)
	f, err := os.Create(verFile)
	if nil != err {
		panic(err)
	}
	if _, err := f.Write(src); nil != err {
		panic(err)
	}
	if err := f.Close(); nil != err {
		panic(err)
	}

}

var versionTpl = template.Must(template.New("").Parse(`// Code generated by go generate; DO NOT EDIT.
package {{ .Package }}

func init() {
	GitRev = "{{ .GitRev }}"
  {{ if .Version -}}
	GitVersion = "{{ .Version }}"
	{{ end -}}
	GitTimestamp = "{{ .Timestamp }}"
}
`))
