// +build ignore

// go run generate.go && go fmt

// The generate-charset-data command generates the Go source code
// for github.com/paulrosania/go-charset/data from the data files
// found in github.com/paulrosania/go-charset/datafiles.
// It should be run in the go-charset root directory.
// The resulting Go files will need gofmt'ing.
package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"text/template"
)

type info struct {
	Path string
}

var tfuncs = template.FuncMap{
	"basename": func(s string) string {
		return filepath.Base(s)
	},
	"read": func(path string) ([]byte, error) {
		return ioutil.ReadFile(path)
	},
}

var tmpl = template.Must(template.New("").Funcs(tfuncs).Parse(`
	// This file is automatically generated by generate-charset-data.
	// Do not hand-edit.

	package data
	import (
		"github.com/paulrosania/go-charset/charset"
		"io"
		"io/ioutil"
		"strings"
	)

	func init() {
		charset.RegisterDataFile({{basename .Path | printf "%q"}}, func() (io.ReadCloser, error) {
			r := strings.NewReader({{read .Path | printf "%q"}})
			return ioutil.NopCloser(r), nil
		})
	}
`))

var docTmpl = template.Must(template.New("").Funcs(tfuncs).Parse(`
	// This file is automatically generated by generate-charset-data.
	// Do not hand-edit.

	// The {{basename .Package}} package embeds all the charset
	// data files as Go data. It registers the data with the charset
	// package as a side effect of its import. To use:
	//
	//	import _ "github.com/paulrosania/go-charset"
	package {{basename .Package}}
`))

func main() {
	dataDir := filepath.Join("..", "datafiles")
	d, err := os.Open(dataDir)
	if err != nil {
		fatalf("%v", err)
	}
	names, err := d.Readdirnames(0)
	if err != nil {
		fatalf("cannot read datafiles dir: %v", err)
	}
	for _, name := range names {
		writeFile("data_"+name+".go", tmpl, info{
			Path: filepath.Join(dataDir, name),
		})
	}
}

func writeFile(name string, t *template.Template, data interface{}) {
	w, err := os.Create(name)
	if err != nil {
		fatalf("cannot create output file: %v", err)
	}
	defer w.Close()
	err = t.Execute(w, data)
	if err != nil {
		fatalf("template execute %q: %v", name, err)
	}
}

func fatalf(f string, a ...interface{}) {
	fmt.Fprintf(os.Stderr, "%s\n", fmt.Sprintf(f, a...))
	os.Exit(2)
}
