package cmd

import (
	"context"
	"git.jfdev.de/JonasFranzDEV/hal/hal"
	"git.jfdev.de/JonasFranzDEV/hal/parser"
	"github.com/spf13/cobra"
	"gopkg.in/yaml.v2"
	"io/ioutil"
	"os"
)

var clusterCmd = &cobra.Command{
	Args: cobra.ExactArgs(1),
	Use:  "cluster [config file]",
	RunE: runClusterCommand,
}

func init() {
	rootCommand.AddCommand(clusterCmd)
}

func runClusterCommand(cmd *cobra.Command, args []string) error {
	configFile := args[0]

	// Parse config
	if stats, err := os.Stat(configFile); err != nil || stats.IsDir() {
		return err
	}

	file, err := ioutil.ReadFile(configFile)
	if err != nil {
		return err
	}
	config := &hal.ClusterConfig{}
	if err := yaml.Unmarshal(file, config); err != nil {
		return err
	}

	logger, err := hal.NewPageErrorLogger("page_errors")
	if err != nil {
		return err
	}
	defer logger.Close()

	// Parse modules
	modules, err := parser.GetModulesFromConfig(config, debug, logger)
	if err != nil {
		return err
	}

	// Create the cluster
	cluster, err := config.BuildCluster(modules)
	if err != nil {
		return err
	}

	// Run
	return cluster.Run(context.Background())
}