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

//go:generate go run makestatic.go

import (
	"bytes"
	"fmt"
	"go/format"
	"io/ioutil"
	"strings"
	"unicode"

	"golang.org/x/website/markdown"
)

var files = []string{
	"analysis/call3.png",
	"analysis/call-eg.png",
	"analysis/callers1.png",
	"analysis/callers2.png",
	"analysis/chan1.png",
	"analysis/chan2a.png",
	"analysis/chan2b.png",
	"analysis/error1.png",
	"analysis/help.html",
	"analysis/ident-def.png",
	"analysis/ident-field.png",
	"analysis/ident-func.png",
	"analysis/ipcg-func.png",
	"analysis/ipcg-pkg.png",
	"analysis/typeinfo-pkg.png",
	"analysis/typeinfo-src.png",
	"codewalk.html",
	"codewalkdir.html",
	"dirlist.html",
	"doc/code.html",
	"doc/conduct.html",
	"doc/copyright.html",
	"doc/devel/pre_go1.html",
	"doc/devel/release.html",
	"doc/devel/weekly.html",
	"doc/docs.html",
	"doc/gopath_code.html",
	"doc/root.html",
	"doc/security.html",
	"error.html",
	"example.html",
	"godoc.html",
	"godocs.js",
	"images/cloud-download.svg",
	"images/go-logo-blue.svg",
	"images/home-gopher.png",
	"images/footer-gopher.jpg",
	"images/minus.gif",
	"images/play-link.svg",
	"images/plus.gif",
	"jquery.js",
	"opensearch.xml",
	"package.html",
	"packageroot.html",
	"play.js",
	"playground.js",
	"search.html",
	"searchcode.html",
	"searchdoc.html",
	"searchtxt.html",
	"style.css",
}

var markdownFiles = []string{
	"doc/modules.md",
}

// Generate reads a set of files and returns a file buffer that declares
// a map of string constants containing contents of the input files.
func Generate() ([]byte, error) {
	buf := new(bytes.Buffer)
	fmt.Fprintf(buf, "%v\n\n%v\n\npackage static\n\n", license, warning)
	fmt.Fprintf(buf, "var Files = map[string]string{\n")

	for _, fn := range files {
		b, err := ioutil.ReadFile(fn)
		if err != nil {
			return nil, err
		}
		fmt.Fprintf(buf, "\t%q: ", fn)
		appendQuote(buf, b)
		fmt.Fprintf(buf, ",\n\n")
	}

	for _, fn := range markdownFiles {
		src, err := ioutil.ReadFile(fn)
		if err != nil {
			return nil, err
		}
		gen, err := markdown.Render(src)
		if err != nil {
			return nil, fmt.Errorf("%s: %v", fn, err)
		}
		htmlName := strings.TrimSuffix(fn, ".md") + ".html"
		fmt.Fprintf(buf, "\t%q: ", htmlName)
		appendQuote(buf, gen)
		fmt.Fprintf(buf, ",\n\n")
	}

	fmt.Fprintln(buf, "}")
	return format.Source(buf.Bytes())
}

// appendQuote is like strconv.AppendQuote, but we avoid the latter
// because it changes when Unicode evolves, breaking gen_test.go.
func appendQuote(out *bytes.Buffer, data []byte) {
	out.WriteByte('"')
	for _, b := range data {
		if b == '\\' || b == '"' {
			out.WriteByte('\\')
			out.WriteByte(b)
		} else if b <= unicode.MaxASCII && unicode.IsPrint(rune(b)) && !unicode.IsSpace(rune(b)) {
			out.WriteByte(b)
		} else {
			fmt.Fprintf(out, "\\x%02x", b)
		}
	}
	out.WriteByte('"')
}

const warning = `// Code generated by "makestatic"; DO NOT EDIT.`

const license = `// Copyright 2019 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.`
