package main

import (
	"embed"
	"flag"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"text/template"

	"github.com/spf13/cobra"
	"sigs.k8s.io/yaml"
)

var config = flag.String("config", "", "Path to config file")
var outputDir = flag.String("output-dir", "", "Path to the output directory")

//go:embed values-tmpl
var valuesTmpls embed.FS

var rootCmd *cobra.Command

var installFlags struct {
	config    string
	appName   string
	outputDir string
}

func init() {
	rootCmd = &cobra.Command{
		Use: "pcloud",
	}
	installCmd := &cobra.Command{
		Use:  "install",
		RunE: installCmdRun,
	}
	installCmd.Flags().StringVar(
		&installFlags.config,
		"config",
		"",
		"",
	)
	installCmd.Flags().StringVar(
		&installFlags.appName,
		"app",
		"",
		"",
	)
	installCmd.Flags().StringVar(
		&installFlags.outputDir,
		"output-dir",
		"",
		"",
	)
	rootCmd.AddCommand(installCmd)
}

func readConfig(config string) (Config, error) {
	var cfg Config
	inp, err := ioutil.ReadFile(config)
	if err != nil {
		return cfg, err
	}
	err = yaml.UnmarshalStrict(inp, &cfg)
	return cfg, err
}

func installCmdRun(cmd *cobra.Command, args []string) error {
	cfg, err := readConfig(installFlags.config)
	if err != nil {
		return err
	}
	tmpls, err := template.ParseFS(valuesTmpls, "values-tmpl/*.yaml")
	if err != nil {
		log.Fatal(err)
	}
	apps := CreateAllApps(tmpls)
	for _, a := range apps {
		if a.Name == installFlags.appName {
			for _, t := range a.Templates {
				out, err := os.Create(filepath.Join(installFlags.outputDir, t.Name()))
				if err != nil {
					return err
				}
				defer out.Close()
				if err := t.Execute(out, cfg); err != nil {
					return err
				}
			}
			break
		}
	}
	return nil
}

func main() {
	if err := rootCmd.Execute(); err != nil {
		log.Fatal(err)
	}
}
