package main

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

	"github.com/spf13/cobra"
	"k8s.io/client-go/tools/clientcmd"
	clientapi "k8s.io/client-go/tools/clientcmd/api"

	"code.hackerspace.pl/hscloud/cluster/clustercfg/certs"
	"code.hackerspace.pl/hscloud/go/workspace"
)

var admincredsCmd = &cobra.Command{
	Use:   "admincreds",
	Short: "Acquire emergency Kubernetes credentials",
	Long: `
Use secretstore secrets to generate a Kubernetes system:masters keypair and
certificate. Only for use in emergencies.

Your local username and hostname will make part of the cert and can be used
for auditing of accesses to apiservers.
`,
	Run: func(cmd *cobra.Command, args []string) {
		ws, err := workspace.Get()
		if err != nil {
			log.Fatalf("Could not figure out workspace: %v", err)
		}

		uname := "UNKNOWN"
		if u, err := user.Current(); err == nil {
			uname = u.Username
		}
		hostname := "UNKNOWN"
		if h, err := os.Hostname(); err == nil {
			hostname = h
		}
		breadcrumb := fmt.Sprintf("%s@%s", uname, hostname)

		root := filepath.Join(ws, "cluster")
		path := filepath.Join(ws, ".kubectl", "admincreds")
		c := certs.Prepare(root, nil)
		creds := c.MakeKubeEmergencyCreds(path, breadcrumb)
		_ = creds

		log.Printf("")
		log.Printf("WARNING WARNING WARNING WARNING WARNING WARNING")
		log.Printf("===============================================")
		log.Printf("")
		log.Printf("You are requesting ADMIN credentials.")
		log.Printf("")
		log.Printf("You likely shouldn't be doing this, and")
		log.Printf("instead should be using `prodaccess`.")
		log.Printf("")
		log.Printf("===============================================")
		log.Printf("WARNING WARNING WARNING WARNING WARNING WARNING")
		log.Printf("")

		log.Printf("Issuing certs...")
		if err := creds.Ensure(); err != nil {
			log.Fatalf("Failed: %v", err)
		}

		log.Printf("Configuring kubectl...")
		caPath, certPath, keyPath := creds.Paths()
		if err := installKubeletConfig(caPath, certPath, keyPath, "emergency.k0"); err != nil {
			log.Fatalf("Failed: %v", err)
		}

		log.Fatalf("Done. Use kubectl --context=emergency.k0")
	},
}

func installKubeletConfig(caPath, certPath, keyPath, configName string) error {
	ca := clientcmd.NewDefaultPathOptions()
	config, err := ca.GetStartingConfig()
	if err != nil {
		return fmt.Errorf("getting initial config failed: %w", err)
	}

	config.AuthInfos[configName] = &clientapi.AuthInfo{
		ClientCertificate: certPath,
		ClientKey:         keyPath,
	}

	config.Clusters[configName] = &clientapi.Cluster{
		CertificateAuthority: caPath,
		Server:               "https://k0.hswaw.net:4001",
	}

	config.Contexts[configName] = &clientapi.Context{
		AuthInfo:  configName,
		Cluster:   configName,
		Namespace: "default",
	}

	if err := clientcmd.ModifyConfig(ca, *config, true); err != nil {
		return fmt.Errorf("modifying config failed: %w", err)
	}
	return nil
}

func init() {
	rootCmd.AddCommand(admincredsCmd)
}
