package main

import (
	"flag"
	"strings"

	"go.skia.org/infra/go/common"
	"go.skia.org/infra/go/sklog"
	"go.skia.org/infra/kube/go/kube_conf_gen_lib"
)

func main() {
	var (
		// Define the flags and then parse them in common.Init.
		templateFileName = flag.String("t", "", "Template file name.")
		configFileNames  = common.NewMultiStringFlag("c", nil, "Config file name")
		outputFileName   = flag.String("o", "", "Output file name. Use \"-o _\" to write to stdout.")
		emptyQuotes      = flag.Bool("quote", false, "Replace config values that are empty strings with empty single quotes ('').")
		parseConf        = flag.Bool("parse_conf", true, "Convert config options to string.")
		extraVars        = common.NewMultiStringFlag("extra", nil, "Extra key value pair(s), separated by a colon, eg. \"key:value\"")
		strict           = flag.Bool("strict", false, "If true, error out for unsupported types, missing data, etc.")
	)
	common.Init()

	if *templateFileName == "" {
		sklog.Fatal("-t is required.")
	}
	if *outputFileName == "" {
		sklog.Fatal("-o is required.")
	}
	if len(*configFileNames) == 0 {
		sklog.Fatal("-c is required.")
	}
	extraVarsMap := map[string]string{}
	for _, pair := range *extraVars {
		split := strings.SplitN(pair, ":", 2)
		if len(split) != 2 {
			sklog.Fatalf("Invalid key/value pair for --extra: %q; should be \"key:value\"", pair)
		}
		extraVarsMap[split[0]] = split[1]
	}

	// Assemble the config map.
	config, err := kube_conf_gen_lib.LoadConfigFiles(*parseConf, *strict, *emptyQuotes, *configFileNames...)
	if err != nil {
		sklog.Fatalf("Error loading config files: %s", err)
	}
	for k, v := range extraVarsMap {
		config[k] = v
	}

	// Generate the output.
	if err := kube_conf_gen_lib.GenerateOutputFromTemplateFile(*templateFileName, *strict, config, *outputFileName); err != nil {
		sklog.Fatal(err)
	}
}
