// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file implements output formatting for the cobalt config parser.

package config_parser

import (
	"bytes"
	"config"
	"encoding/base64"
	"fmt"
	"github.com/golang/protobuf/proto"
)

type OutputFormatter func(c *config.CobaltConfig) (outputBytes []byte, err error)

// Outputs the serialized proto.
func BinaryOutput(c *config.CobaltConfig) (outputBytes []byte, err error) {
	return proto.Marshal(c)
}

// Outputs the serialized proto base64 encoded.
func Base64Output(c *config.CobaltConfig) (outputBytes []byte, err error) {
	configBytes, err := BinaryOutput(c)
	if err != nil {
		return outputBytes, err
	}
	encoder := base64.StdEncoding
	outLen := encoder.EncodedLen(len(configBytes))

	outputBytes = make([]byte, outLen, outLen)
	encoder.Encode(outputBytes, configBytes)
	return outputBytes, nil
}

// Returns an output formatter that will output the contents of a C++ header
// file that contains a variable declaration for a string literal that contains
// the base64-encoding of the serialized proto.
//
// varName will be the name of the variable containing the base64-encoded serialized proto.
// namespace is a list of nested namespaces inside of which the variable will be defined.
// configLocation is the location of the YAML that was parsed.
func CppOutputFactory(varName string, namespace []string, configLocation string) OutputFormatter {
	return func(c *config.CobaltConfig) (outputBytes []byte, err error) {
		b64Bytes, err := Base64Output(c)
		if err != nil {
			return outputBytes, err
		}

		out := new(bytes.Buffer)
		out.WriteString("// Copyright 2018 The Fuchsia Authors. All rights reserved.\n")
		out.WriteString("// Use of this source code is governed by a BSD-style license that can be\n")
		out.WriteString("// found in the LICENSE file.\n\n")
		out.WriteString("#pragma once\n\n")
		out.WriteString("// This file was generated by Cobalt's Config Parser based on the\n")
		out.WriteString("// configuration YAML in the following location:\n")
		out.WriteString(fmt.Sprintf("// %s\n", configLocation))
		out.WriteString("// Edit the YAML at that location to make changes.\n\n")

		for _, name := range namespace {
			out.WriteString("namespace ")
			out.WriteString(name)
			out.WriteString(" {\n")
		}

		out.WriteString("// The base64 encoding of the bytes of a serialized CobaltConfig proto message.\n")
		out.WriteString("const char ")
		out.WriteString(varName)
		out.WriteString("[] = \"")
		out.Write(b64Bytes)
		out.WriteString("\";\n")

		for _, name := range namespace {
			out.WriteString("} // ")
			out.WriteString(name)
			out.WriteString("\n")
		}
		return out.Bytes(), nil
	}
}
