// Copyright 2014 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

package main

import (
	"bytes"
	"flag"
	"go/format"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"os/exec"
	"strings"
	"text/template"
)

const (
	goRepoPath = 1 << iota
	packagePath
)

var tmpl = template.Must(template.New("").Parse(`// Created by go generate; DO NOT EDIT
// Copyright 2014 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 gosrc

const (
    goRepoPath = {{.goRepoPath}}
    packagePath = {{.packagePath}}
)

var pathFlags = map[string]int{
{{range $k, $v := .pathFlags}}{{printf "%q" $k}}: {{$v}},
{{end}} }

var validTLDs = map[string]bool{
{{range  $v := .validTLDs}}{{printf "%q" $v}}: true,
{{end}} }
`))

var output = flag.String("output", "data.go", "file name to write")

func main() {
	log.SetFlags(0)
	log.SetPrefix("gen: ")
	flag.Parse()
	if flag.NArg() != 0 {
		log.Fatal("usage: decgen [--output filename]")
	}

	// Build map of standard repository path flags.

	cmd := exec.Command("go", "list", "std")
	p, err := cmd.Output()
	if err != nil {
		log.Fatal(err)
	}
	pathFlags := map[string]int{
		"builtin": packagePath | goRepoPath,
		"C":       packagePath,
	}
	for _, path := range strings.Fields(string(p)) {
		if strings.HasPrefix(path, "cmd/") {
			continue
		}
		pathFlags[path] |= packagePath | goRepoPath
		for {
			i := strings.LastIndex(path, "/")
			if i < 0 {
				break
			}
			path = path[:i]
			pathFlags[path] |= goRepoPath
		}
	}

	// Get list of valid TLDs.

	resp, err := http.Get("https://data.iana.org/TLD/tlds-alpha-by-domain.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	p, err = ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}

	var validTLDs []string
	for _, line := range strings.Split(string(p), "\n") {
		line = strings.TrimSpace(line)
		if len(line) == 0 || line[0] == '#' {
			continue
		}
		validTLDs = append(validTLDs, "."+strings.ToLower(line))
	}

	// Generate output.

	var buf bytes.Buffer
	err = tmpl.Execute(&buf, map[string]interface{}{
		"output":      *output,
		"goRepoPath":  goRepoPath,
		"packagePath": packagePath,
		"pathFlags":   pathFlags,
		"validTLDs":   validTLDs,
	})
	if err != nil {
		log.Fatal("template error:", err)
	}
	source, err := format.Source(buf.Bytes())
	if err != nil {
		log.Fatal("source format error:", err)
	}
	fd, err := os.Create(*output)
	_, err = fd.Write(source)
	if err != nil {
		log.Fatal(err)
	}
}
