// 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/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
}
