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

// cli.go implements logic to create a generator config object from command
// line arguments.

package common

import (
	"flag"
	"io"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"

	"mojo/public/go/bindings"
	"mojom/mojom_parser/generated/mojom_files"
)

// GetConfig provides the primary interface for generators.
// By calling GetConfig, a generator implements the command line interface
// that is used by all generators.
func GetCliConfig(args []string) GeneratorConfig {
	config := new(generatorCliConfig)
	flagSet := flag.NewFlagSet("Generator Common Flag Set", flag.ExitOnError)

	var fileGraphFile string
	flagSet.StringVar(&fileGraphFile, "file-graph", "-",
		"Location of the parser output. \"-\" for stdin. (default \"-\")")
	flagSet.StringVar(&config.outputDir, "output-dir", ".",
		"output directory for generated files.")
	flagSet.StringVar(&config.srcRootPath, "src-root-path", ".",
		"relative path to the root of the source tree.")
	flagSet.BoolVar(&config.noGenImports, "no-gen-imports", false,
		"Generate code only for the files that are specified on the command line. "+
			"By default, code is generated for all specified files and their transitive imports.")

	flagSet.Parse(args[1:])

	// Compute the absolute path for the source root and the output directory.
	var err error
	config.srcRootPath, err = filepath.Abs(config.srcRootPath)
	if err != nil {
		log.Fatalln(err.Error())
	}

	config.outputDir, err = filepath.Abs(config.outputDir)
	if err != nil {
		log.Fatalln(err.Error())
	}

	// Read the file graph either from standard in or the specified file.
	var fileGraphReader io.Reader
	if fileGraphFile == "-" {
		fileGraphReader = os.Stdin
	} else {
		var err error
		if fileGraphReader, err = os.Open(fileGraphFile); err != nil {
			log.Fatalln(err.Error())
		}
	}

	config.fileGraph = decodeFileGraph(fileGraphReader)
	return config
}

// decodeFileGraph decodes a serialized MojomFileGraph.
func decodeFileGraph(in io.Reader) (fileGraph *mojom_files.MojomFileGraph) {
	inputBytes, err := ioutil.ReadAll(in)
	if err != nil {
		log.Fatalf("Failed to read: %v\n", err)
	}

	decoder := bindings.NewDecoder(inputBytes, nil)
	fileGraph = new(mojom_files.MojomFileGraph)
	if err := fileGraph.Decode(decoder); err != nil {
		log.Fatalf("Failed to decode file graph: %v\n", err)
	}

	return
}

// generatorCliConfig implements GeneratorConfig.
type generatorCliConfig struct {
	fileGraph    *mojom_files.MojomFileGraph
	outputDir    string
	srcRootPath  string
	noGenImports bool
}

// See GeneratorConfig.
func (c *generatorCliConfig) FileGraph() *mojom_files.MojomFileGraph {
	return c.fileGraph
}

// See GeneratorConfig.
func (c *generatorCliConfig) OutputDir() string {
	return c.outputDir
}

// See GeneratorConfig.
func (c *generatorCliConfig) SrcRootPath() string {
	return c.srcRootPath
}

// See GeneratorConfig.
func (c *generatorCliConfig) GenImports() bool {
	return !c.noGenImports
}
