// Copyright 2015 The Vanadium 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 metadata implements a mechanism for setting and retrieving metadata
// stored in program binaries.
//
// Metadata is a flat mapping of unique string identifiers to their associated
// string values.  Both the ids and the values should be human-readable strings,
// since many uses of metadata involve textual output for humans; e.g. dumping
// metadata from the program on the command-line, or prepending metadata to log
// files.
//
// The ids must be unique, and avoiding collisions is up to the users of this
// package; it is recommended to prefix your identifiers with your project name.
//
// There are typically two sources for metadata, both supported by this package:
//
// 1) External metadata gathered by a build tool, e.g. the build timestamp.
//
// 2) Internal metadata compiled into the program, e.g. version numbers.
//
// External metadata is injected into the program binary by the linker.  The Go
// ld linker provides a -X option that may be used for this purpose; see LDFlag
// for more details.
//
// Internal metadata is already compiled into the program binary, but the
// metadata package must still be made aware of it.  Call the Insert function in
// an init function to accomplish this:
//
//   package mypkg
//   import "go.fuchsia.dev/jiri/metadata"
//
//   func init() {
//     metadata.Insert("myproject.myid", "value")
//   }
//
// The built-in metadata comes pre-populated with the Go architecture, operating
// system and version.
//
// This package registers a flag -metadata via an init function.  Setting
// -metadata on the command-line causes the program to dump metadata in the
// XML format and exit.
package metadata

import (
	"bytes"
	"compress/zlib"
	"encoding/base64"
	"encoding/xml"
	"flag"
	"fmt"
	"io"
	"os"
	"reflect"
	"runtime"
	"sort"
	"strings"
)

// T represents the metadata for a program binary.
type T struct {
	entries map[string]string
}

// String returns a human-readable representation; the same as ToXML.
func (x *T) String() string {
	return x.ToXML()
}

// Insert sets the metadata entry for id to value, and returns the previous
// value.  Whitespace is trimmed from either end of the value.
func (x *T) Insert(id, value string) string {
	if x.entries == nil {
		x.entries = make(map[string]string)
	}
	old := x.entries[id]
	x.entries[id] = strings.TrimSpace(value)
	return old
}

// Lookup retrieves the value for the given id from x.
func (x *T) Lookup(id string) string {
	return x.entries[id]
}

// FromMap returns new metadata initialized with the given entries.  Calls
// Insert on each element of entries.
func FromMap(entries map[string]string) *T {
	x := new(T)
	for id, value := range entries {
		x.Insert(id, value)
	}
	return x
}

// ToMap returns a copy of the entries in x.  Mutating the returned map has no
// effect on x.
func (x *T) ToMap() map[string]string {
	if len(x.entries) == 0 {
		return nil
	}
	ret := make(map[string]string, len(x.entries))
	for id, value := range x.entries {
		ret[id] = value
	}
	return ret
}

type xmlMetaData struct {
	XMLName struct{}   `xml:"metadata"`
	Entries []xmlEntry `xml:"md"`
}

type xmlEntry struct {
	ID string `xml:"id,attr"`
	// When marshalling only one of Value or ValueCDATA is set; Value is normally
	// used, and ValueCDATA is used to add explicit "<![CDATA[...]]>" wrapping.
	//
	// When unmarshalling Value is set to the unescaped data, while ValueCDATA is
	// set to the raw XML.
	Value      string `xml:",chardata"`
	ValueCDATA string `xml:",innerxml"`
}

// FromXML returns new metadata initialized with the given XML encoded data.
// The expected schema is described in ToXML.
func FromXML(data []byte) (*T, error) {
	x := new(T)
	if len(data) == 0 {
		return x, nil
	}
	var xmlData xmlMetaData
	if err := xml.Unmarshal(data, &xmlData); err != nil {
		return nil, err
	}
	for _, entry := range xmlData.Entries {
		x.Insert(entry.ID, entry.Value)
	}
	return x, nil
}

// ToXML returns the XML encoding of x, using the schema described below.
//
//   <metadata>
//     <md id="A">a value</md>
//     <md id="B"><![CDATA[
//       foo
//       bar
//     ]]></md>
//     <md id="C">c value</md>
//   </metadata>
func (x *T) ToXML() string {
	return x.toXML(true)
}

func (x *T) toXML(indent bool) string {
	// Write each XML <md> entry ordered by id.
	var ids []string
	for id := range x.entries {
		ids = append(ids, id)
	}
	sort.Strings(ids)
	var data xmlMetaData
	for _, id := range ids {
		entry := xmlEntry{ID: id}
		value := x.entries[id]
		if xmlUseCDATASection(value) {
			entry.ValueCDATA = cdataStart + "\n" + value + "\n  " + cdataEnd
		} else {
			entry.Value = value
		}
		data.Entries = append(data.Entries, entry)
	}
	var dataXML []byte
	if indent {
		dataXML, _ = xml.MarshalIndent(data, "", "  ")
	} else {
		dataXML, _ = xml.Marshal(data)
	}
	return string(dataXML)
}

const (
	cdataStart = "<![CDATA["
	cdataEnd   = "]]>"
)

func xmlUseCDATASection(value string) bool {
	// Cannot use CDATA if "]]>" appears since that's the CDATA terminator.
	if strings.Contains(value, cdataEnd) {
		return false
	}
	// The choice at this point is a heuristic; it only determines how "pretty"
	// the output looks.
	b := []byte(value)
	var buf bytes.Buffer
	xml.EscapeText(&buf, b)
	return !bytes.Equal(buf.Bytes(), b)
}

// FromBase64 returns new metadata initialized with the given base64 encoded
// data.  The data is expected to have started as a valid XML representation of
// metadata, then zlib compressed, and finally base64 encoded.
func FromBase64(data []byte) (*T, error) {
	if len(data) == 0 {
		return new(T), nil
	}
	dataXML := make([]byte, base64.StdEncoding.DecodedLen(len(data)))
	n, err := base64.StdEncoding.Decode(dataXML, data)
	if err != nil {
		return nil, err
	}
	var b bytes.Buffer
	r, err := zlib.NewReader(bytes.NewReader(dataXML[:n]))
	if err != nil {
		return nil, err
	}
	_, errCopy := io.Copy(&b, r)
	errClose := r.Close()
	switch {
	case errCopy != nil:
		return nil, err
	case errClose != nil:
		return nil, err
	}
	return FromXML(b.Bytes())
}

// ToBase64 returns the base64 encoding of x.  First x is XML encoded, then zlib
// compressed, and finally base64 encoded.
func (x *T) ToBase64() string {
	var b bytes.Buffer
	w := zlib.NewWriter(&b)
	w.Write([]byte(x.toXML(false)))
	w.Close()
	return base64.StdEncoding.EncodeToString(b.Bytes())
}

var thisPkgPath = reflect.TypeOf(T{}).PkgPath()

// LDFlag returns the flag to pass to the Go ld linker to initialize the
// built-in metadata with x.  Calls LDFlagExternal with the appropriate package
// path and unexported variable name to initialize BuiltIn.
func LDFlag(x *T) string {
	return LDFlagExternal(thisPkgPath, "initBuiltIn", x)
}

// LDFlagExternal returns the flag to pass to the Go ld linker to initialize the
// string variable defined in pkgpath to the base64 encoding of x.  See the
// documentation of the -X option at https://golang.org/cmd/ld
//
// The base64 encoding is used to avoid quoting and escaping issues when passing
// the flag through the go toolchain.  An example of using the result to install
// a Go binary with metadata x:
//
//   LDFlagExternal("main", "myvar", x) == "-X main.myvar=eJwBAAD//wAAAAE="
//
//   $ go install -ldflags="-X main.myvar=eJwBAAD//wAAAAE=" mypackage
func LDFlagExternal(pkgpath, variable string, x *T) string {
	return fmt.Sprintf("-X %s.%s=%s", pkgpath, variable, x.ToBase64())
}

// Insert sets the built-in metadata entry for id to value, and returns the
// previous value.  Whitespace is trimmed from either end of the value.
//
// The built-in metadata is initialized by the Go ld linker.  See the LDFlag
// function for more details.
func Insert(id, value string) string { return BuiltIn.Insert(id, value) }

// Lookup retrieves the value for the given id from the built-in metadata.
func Lookup(id string) string { return BuiltIn.Lookup(id) }

// ToBase64 returns the base64 encoding of the built-in metadata.  First the
// metadata is XML encoded, then zlib compressed, and finally base64 encoded.
func ToBase64() string { return BuiltIn.ToBase64() }

// ToXML returns the XML encoding of the built-in metadata.  The schema is
// defined in T.ToXML.
func ToXML() string { return BuiltIn.ToXML() }

// ToMap returns a copy of the entries in the built-in metadata.  Mutating the
// returned map has no effect on the built-in metadata.
func ToMap() map[string]string { return BuiltIn.ToMap() }

// BuiltIn represents the metadata built-in to the Go program.  The top-level
// functions such as Insert, ToBase64, and so on are wrappers for the methods of
// BuiltIn.
var BuiltIn T

// initBuiltIn is expected to be initialized by the Go ld linker.
var initBuiltIn string

func init() {
	// First initialize the BuiltIn metadata based on linker-injected metadata.
	if x, err := FromBase64([]byte(initBuiltIn)); err != nil {
		// Don't panic, since a binary without metadata is more useful than a binary
		// that always panics with invalid metadata.
		fmt.Fprintf(os.Stderr, `
metadata: built-in initialization failed (%v) from base64 data: %v
`, err, initBuiltIn)
	} else {
		BuiltIn = *x
	}
	// Now set values from the runtime.  These may not be overridden by the
	// linker-injected metadata, and should not be overridden by user packages.
	BuiltIn.Insert("go.Arch", runtime.GOARCH)
	BuiltIn.Insert("go.OS", runtime.GOOS)
	BuiltIn.Insert("go.Version", runtime.Version())

	flag.Var(metadataFlag{}, "metadata", "Displays metadata for the program and exits.")
}

// metadataFlag implements a flag that dumps the default metadata and exits the
// program when it is set.
type metadataFlag struct{}

func (metadataFlag) IsBoolFlag() bool { return true }
func (metadataFlag) String() string   { return "<just specify -metadata to activate>" }
func (metadataFlag) Set(string) error {
	fmt.Println(BuiltIn.String())
	os.Exit(0)
	return nil
}
