package azure

import (
	"fmt"

	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/tools/clientcmd/api"
)

const (
	workloadIdentityLoginMethod = "workloadidentity"
	getTokenCommand             = "get-token"
	argLoginMethod              = "--login"
	argServerID                 = "--server-id"
)

func ConvertToWorkloadIdentityLogin(data []byte) ([]byte, error) {
	kubeconfig, err := clientcmd.Load(data)
	if err != nil {
		return nil, fmt.Errorf("failed to load kubeconfig: %w", err)
	}

	if kubeconfig.AuthInfos == nil || len(kubeconfig.AuthInfos) == 0 {
		return nil, fmt.Errorf("no authInfos found in kubeconfig")
	}

	for _, authInfo := range kubeconfig.AuthInfos {
		original := authInfo.DeepCopy()
		exec := authInfo.Exec
		exec.Args = []string{getTokenCommand}
		exec.Args = append(exec.Args, argLoginMethod, workloadIdentityLoginMethod)

		// all login methods require --server-id specified
		argServerIDVal := getExecArg(original, argServerID)
		if argServerIDVal == "" {
			return nil, fmt.Errorf("%s is required", argServerID)
		}
		exec.Args = append(exec.Args, argServerID, argServerIDVal)
		authInfo.Exec = exec
	}
	modifiedKubeconfig, err := clientcmd.Write(*kubeconfig)
	if err != nil {
		return nil, fmt.Errorf("failed to write kubeconfig: %w", err)
	}
	return modifiedKubeconfig, nil
}

// get the item in Exec.Args[] right after someArg
func getExecArg(authInfoPtr *api.AuthInfo, someArg string) (resultStr string) {
	if someArg == "" {
		return
	}
	if authInfoPtr == nil || authInfoPtr.Exec == nil || authInfoPtr.Exec.Args == nil {
		return
	}
	if len(authInfoPtr.Exec.Args) < 1 {
		return
	}
	for i := range authInfoPtr.Exec.Args {
		if authInfoPtr.Exec.Args[i] == someArg {
			if len(authInfoPtr.Exec.Args) > i+1 {
				return authInfoPtr.Exec.Args[i+1]
			}
		}
	}
	return
}
