package main

import (
	"context"
	"flag"
	"fmt"
	"io/ioutil"
	"path"

	v1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/api/errors"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"

	"github.com/miracl/conflate"
)

var baseFile = flag.String("base", "", "Path to the homeserver.yaml config file.")
var mergeWith = flag.String("merge-with", "", "Name of the file from config to merge.")
var namespace = flag.String("namespace", "", "Namespace name.")
var configMapName = flag.String("config-map-name", "", "Name of the ConfigMap to create.")

func createClient() *kubernetes.Clientset {
	config, err := rest.InClusterConfig()
	if err != nil {
		panic(err.Error())
	}
	cs, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
	return cs
}

func newConig(data []byte) *v1.ConfigMap {
	return &v1.ConfigMap{
		TypeMeta: metav1.TypeMeta{
			Kind:       "ConfigMap",
			APIVersion: "v1",
		},
		ObjectMeta: metav1.ObjectMeta{
			Name: *configMapName,
		},
		Data: map[string]string{
			path.Base(*baseFile): string(data),
		},
	}
}

func main() {
	flag.Parse()
	client := createClient().CoreV1().ConfigMaps(*namespace)
	conf := conflate.New()
	generated, err := ioutil.ReadFile(*baseFile)
	if err != nil {
		panic(err)
	}
	fmt.Printf("--- BASE:\n%s\n", string(generated))
	if err := conf.AddData(generated); err != nil {
		panic(err)
	}
	mergeWith, err := ioutil.ReadFile(*mergeWith)
	if err != nil {
		panic(err)
	}
	fmt.Printf("--- MERGE WITH:\n%s\n", string(mergeWith))
	if err := conf.AddData(mergeWith); err != nil {
		panic(err)
	}
	merged, err := conf.MarshalYAML()
	if err != nil {
		panic(err)
	}
	fmt.Printf("--- MERGED:\n%s\n", string(merged))
	config := newConig(merged)
	_, err = client.Create(context.TODO(), config, metav1.CreateOptions{})
	if err == nil {
		return
	}
	if !errors.IsAlreadyExists(err) {
		panic(err)
	}
	_, err = client.Update(context.TODO(), config, metav1.UpdateOptions{})
	if err != nil {
		panic(err)
	}
}
