// Copyright 2018 The CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package cmd

import (
	"encoding/json"
	"fmt"
	"io"

	"github.com/spf13/cobra"

	"cuelang.org/go/cue"
	"cuelang.org/go/pkg/encoding/yaml"
)

// newExportCmd creates and export command
func newExportCmd(c *Command) *cobra.Command {
	cmd := &cobra.Command{
		Use:   "export",
		Short: "output data in a standard format",
		Long: `export evaluates the configuration found in the current
directory and prints the emit value to stdout.

Examples:
Evaluated and emit

	# a single file
	cue export config.cue

	# multiple files: these are combined at the top-level. Order doesn't matter.
	cue export file1.cue foo/file2.cue

	# all files within the "mypkg" package: this includes all files in the
	# current directory and its ancestor directories that are marked with the
	# same package.
	cue export -p cloud

	# the -p flag can be omitted if the directory only contains files for
	# the "mypkg" package.
	cue export

Emit value:
For CUE files, the generated configuration is derived from the top-level
single expression, the emit value. For example, the file

	// config.cue
	arg1: 1
	arg2: "my string"

	{
		a: arg1
		b: arg2
	}

yields the following JSON:

	{
		"a": 1,
		"b", "my string"
	}

In absence of arguments, the current directory is loaded as a package instance.
A package instance for a directory contains all files in the directory and its
ancestor directories, up to the module root, belonging to the same package.
If the package is not explicitly defined by the '-p' flag, it must be uniquely
defined by the files in the current directory.


Formats
The following formats are recognized:

json    output as JSON
		Outputs any CUE value.

text    output as raw text
        The evaluated value must be of type string.
`,

		RunE: mkRunE(c, runExport),
	}
	flagMedia.Add(cmd)
	cmd.Flags().Bool(string(flagEscape), false, "use HTML escaping")

	cmd.Flags().StringArrayP(string(flagTags), "t", nil,
		"set the value of a tagged field")

	return cmd
}

func runExport(cmd *Command, args []string) error {
	instances := buildFromArgs(cmd, args)
	w := cmd.OutOrStdout()

	for _, inst := range instances {
		root := inst.Value()
		switch media := flagMedia.String(cmd); media {
		case "json":
			err := outputJSON(cmd, w, root)
			exitIfErr(cmd, inst, err, true)
		case "text":
			err := outputText(w, root)
			exitIfErr(cmd, inst, err, true)
		case "yaml":
			err := outputYAML(w, root)
			exitIfErr(cmd, inst, err, true)
		default:
			return fmt.Errorf("export: unknown format %q", media)
		}
	}
	return nil
}

func outputJSON(cmd *Command, w io.Writer, v cue.Value) error {
	e := json.NewEncoder(w)
	e.SetIndent("", "    ")
	e.SetEscapeHTML(flagEscape.Bool(cmd))

	err := e.Encode(v)
	if err != nil {
		if x, ok := err.(*json.MarshalerError); ok {
			err = x.Err
		}
		return err
	}
	return nil
}

func outputText(w io.Writer, v cue.Value) error {
	str, err := v.String()
	if err != nil {
		return err
	}
	_, err = fmt.Fprint(w, str)
	return err
}

func outputYAML(w io.Writer, v cue.Value) error {
	str, err := yaml.Marshal(v)
	if err != nil {
		return err
	}
	_, err = fmt.Fprint(w, str)
	return err
}
