// 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 gen is used by content/static/makestatic.go
// to generate content/static/static.go.
//
// This is a separate package so that it can be tested without
// build constraints. cmd/golangorg and other binaries should not
// depend on it.
package gen

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

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

var files = []string{
	"analysis/call-eg.png",
	"analysis/call3.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/contrib.html",
	"doc/copyright.html",
	"doc/devel/pre_go1.html",
	"doc/devel/release.html",
	"doc/devel/weekly.html",
	"doc/docs.html",
	"doc/download.js",
	"doc/gopath_code.html",
	"doc/install.html",
	"doc/install-source.html",
	"doc/manage-install.html",
	"doc/mvs/buildlist.svg",
	"doc/mvs/downgrade.svg",
	"doc/mvs/exclude.svg",
	"doc/mvs/replace.svg",
	"doc/mvs/upgrade.svg",
	"doc/root.html",
	"doc/security.html",
	"doc/tutorial/add-a-test.html",
	"doc/tutorial/call-module-code.html",
	"doc/tutorial/compile-install.html",
	"doc/tutorial/create-module.html",
	"doc/tutorial/getting-started.html",
	"doc/tutorial/greetings-multiple-people.html",
	"doc/tutorial/handle-errors.html",
	"doc/tutorial/images/function-syntax.png",
	"doc/tutorial/index.html",
	"doc/tutorial/random-greeting.html",
	"error.html",
	"example.html",
	"godoc.html",
	"godocs.js",
	"images/cloud-download.svg",
	"images/footer-gopher.jpg",
	"images/go-logo-blue.svg",
	"images/home-gopher.png",
	"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/mod.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.`
