package unittest

import (
	"fmt"
	"os"
	"path/filepath"

	"github.com/spf13/cobra"
)

// TestConfig stores config setup by user in command line
type TestConfig struct {
	UseHelmV3      bool
	Colored        bool
	UpdateSnapshot bool
	WithSubChart   bool
	TestFiles      []string
	OutputFile     string
	OutputType     string
}

var testConfig = TestConfig{}

var cmd = &cobra.Command{
	Use:   "unittest [flags] CHART [...]",
	Short: "unittest for helm charts",
	Long: `Running chart unittest written in YAML.

This renders your charts locally (without tiller) and
validates the rendered output with the tests defined in
test suite files. Simplest test suite file looks like
below:

---
# CHART_PATH/tests/deployment_test.yaml
suite: test my deployment
templates:
  - deployment.yaml
tests:
  - it: should be a Deployment
    asserts:
      - isKind:
          of: Deployment
---

Put the test files in "tests" directory under your chart
with suffix "_test.yaml", and run:

$ helm unittest my-chart

Or specify the suite files glob path pattern:

$ helm unittest -f 'my-tests/*.yaml' my-chart

Check https://github.com/lrills/helm-unittest for more
details about how to write tests.
`,
	Args: cobra.MinimumNArgs(1),
	Run: func(cmd *cobra.Command, chartPaths []string) {
		var colored *bool
		if cmd.PersistentFlags().Changed("color") {
			colored = &testConfig.Colored
		}

		formatter := NewFormatter(testConfig.OutputFile, testConfig.OutputType)
		printer := NewPrinter(os.Stdout, colored)
		runner := TestRunner{Printer: printer, Formatter: formatter, Config: testConfig}
		var passed bool

		if !testConfig.UseHelmV3 {
			passed = runner.RunV2(chartPaths)
		} else {
			passed = runner.RunV3(chartPaths)
		}

		if !passed {
			os.Exit(1)
		}
	},
}

// Execute execute unittest command
func Execute() {
	if err := cmd.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func init() {
	cmd.PersistentFlags().BoolVar(
		&testConfig.Colored, "color", false,
		"enforce printing colored output even stdout is not a tty. Set to false to disable color",
	)

	defaultFilePattern := filepath.Join("tests", "*_test.yaml")
	cmd.PersistentFlags().StringArrayVarP(
		&testConfig.TestFiles, "file", "f", []string{defaultFilePattern},
		"glob paths of test files location, default to "+defaultFilePattern,
	)

	cmd.PersistentFlags().BoolVarP(
		&testConfig.UpdateSnapshot, "update-snapshot", "u", false,
		"update the snapshot cached if needed, make sure you review the change before update",
	)

	cmd.PersistentFlags().BoolVarP(
		&testConfig.WithSubChart, "with-subchart", "s", true,
		"include tests of the subcharts within `charts` folder",
	)

	cmd.PersistentFlags().StringVarP(
		&testConfig.OutputFile, "output-file", "o", "",
		"output-file the file where testresults are written in JUnit format, defaults no output is written to file",
	)

	cmd.PersistentFlags().StringVarP(
		&testConfig.OutputType, "output-type", "t", "XUnit",
		"output-type the file-format where testresults are written in, accepted types are (JUnit, NUnit, XUnit)",
	)

	cmd.PersistentFlags().BoolVarP(
		&testConfig.UseHelmV3, "helm3", "3", false,
		"parse helm charts as helm3 charts.",
	)
}
