// Copyright 2016 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.

// +build ignore

// A script that takes a source Gradle script, and writes a .go file that contains a constant string
// variable that holds the contents of the source script. By doing this, the Gradle script can be
// embedded in the madb binary. This script is located under testdata, to avoid being installed in
// the $GOPATH/bin directory.
//
// This script is meant to be run via go generate from the parent directory.
// See the go:generate comment at the top of madb.go file.
package main

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

const (
	tmpl = `// Copyright 2016 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.

// This file was auto-generated via go generate.
// DO NOT UPDATE MANUALLY

package main

const {{.VarName}} = {{.Backtick}}{{.Contents}}{{.Backtick}}
`
)

func main() {
	if len(os.Args) != 4 {
		fmt.Println("Usage: go run embed_gradle_script.go <source file path> <destination .go file path> <variable name>")
		os.Exit(1)
	}

	if err := generateEmbeddedScript(os.Args[1], os.Args[2], os.Args[3]); err != nil {
		fmt.Fprintf(os.Stderr, "Failed to generate the embedded script: %v", err)
		os.Exit(1)
	}
}

func generateEmbeddedScript(source, dest, varName string) error {
	// Read the source file.
	srcFile, err := os.Open(source)
	if err != nil {
		return err
	}
	defer srcFile.Close()

	bytes, err := ioutil.ReadAll(srcFile)
	if err != nil {
		return err
	}

	// Create the destination file.
	destFile, err := os.Create(dest)
	if err != nil {
		return err
	}
	defer destFile.Close()

	// Load the template.
	t, err := template.New("embedded_gradle").Parse(tmpl)
	if err != nil {
		return err
	}

	// Define the data to be used within the template.
	data := map[string]string{
		"VarName":  varName,
		"Contents": string(bytes),
		"Backtick": "`",
	}

	// Execute the template with the above data.
	if err := t.Execute(destFile, data); err != nil {
		return err
	}

	return nil
}
