package scheduler_k3s

import (
	"fmt"
	"strings"

	"github.com/dokku/dokku/plugins/common"
)

// ReportSingleApp is an internal function that displays the scheduler-k3s report for one or more apps
func ReportSingleApp(appName string, format string, infoFlag string) error {
	if err := common.VerifyAppName(appName); err != nil {
		return err
	}

	flags := map[string]common.ReportFunc{
		"--scheduler-k3s-computed-deploy-timeout":       reportComputedDeployTimeout,
		"--scheduler-k3s-deploy-timeout":                reportDeployTimeout,
		"--scheduler-k3s-global-deploy-timeout":         reportGlobalDeployTimeout,
		"--scheduler-k3s-computed-image-pull-secrets":   reportComputedImagePullSecrets,
		"--scheduler-k3s-image-pull-secrets":            reportImagePullSecrets,
		"--scheduler-k3s-global-image-pull-secrets":     reportGlobalImagePullSecrets,
		"--scheduler-k3s-global-kubeconfig-path":        reportGlobalKubeconfigPath,
		"--scheduler-k3s-global-kube-context":           reportGlobalKubeContext,
		"--scheduler-k3s-computed-letsencrypt-server":   reportComputedLetsencryptServer,
		"--scheduler-k3s-letsencrypt-server":            reportLetsencryptServer,
		"--scheduler-k3s-global-letsencrypt-server":     reportGlobalLetsencryptServer,
		"--scheduler-k3s-global-ingress-class":          reportGlobalIngressClass,
		"--scheduler-k3s-global-letsencrypt-email-prod": reportGlobalLetsencryptEmailProd,
		"--scheduler-k3s-global-letsencrypt-email-stag": reportGlobalLetsencryptEmailStag,
		"--scheduler-k3s-computed-kustomize-root-path":  reportComputedKustomizeRootPath,
		"--scheduler-k3s-kustomize-root-path":           reportKustomizeRootPath,
		"--scheduler-k3s-global-kustomize-root-path":    reportGlobalKustomizeRootPath,
		"--scheduler-k3s-computed-namespace":            reportComputedNamespace,
		"--scheduler-k3s-namespace":                     reportNamespace,
		"--scheduler-k3s-global-namespace":              reportGlobalNamespace,
		"--scheduler-k3s-global-network-interface":      reportGlobalNetworkInterface,
		"--scheduler-k3s-computed-rollback-on-failure":  reportComputedRollbackOnFailure,
		"--scheduler-k3s-rollback-on-failure":           reportRollbackOnFailure,
		"--scheduler-k3s-global-rollback-on-failure":    reportGlobalRollbackOnFailure,
		"--scheduler-k3s-computed-shm-size":             reportComputedShmSize,
		"--scheduler-k3s-global-shm-size":               reportGlobalShmSize,
		"--scheduler-k3s-shm-size":                      reportShmSize,
	}

	chartProperties, err := common.PropertyGetAllByPrefix("scheduler-k3s", "--global", "chart.")
	if err != nil {
		return fmt.Errorf("Unable to get property list: %w", err)
	}
	for name, value := range chartProperties {
		flagName := "--scheduler-k3s-global-" + name
		flags[flagName] = func(appName string) string {
			return value
		}
	}

	flagKeys := []string{}
	for flagKey := range flags {
		flagKeys = append(flagKeys, flagKey)
	}

	trimPrefix := false
	uppercaseFirstCharacter := true
	infoFlags := common.CollectReport(appName, infoFlag, flags)
	return common.ReportSingleApp("scheduler-k3s", appName, infoFlag, infoFlags, flagKeys, format, trimPrefix, uppercaseFirstCharacter)
}

// ReportAutoscalingAuthSingleApp is an internal function that displays the scheduler-k3s autoscaling-auth report for one app
func ReportAutoscalingAuthSingleApp(appName string, format string, includeMetadata bool) error {
	properties, err := common.PropertyGetAllByPrefix("scheduler-k3s", appName, TriggerAuthPropertyPrefix)
	if err != nil {
		return fmt.Errorf("Unable to get property list: %w", err)
	}

	infoFlags := map[string]string{}
	for key, value := range properties {
		metadataKey := strings.TrimPrefix(key, TriggerAuthPropertyPrefix)
		authType := strings.SplitN(metadataKey, ".", 2)[0]
		if authType == "" {
			continue
		}

		infoFlags[authType] = "configured"
		if includeMetadata {
			infoFlags[strings.ReplaceAll(metadataKey, ".", "-")] = value
		}
	}

	flagKeys := []string{}
	for flagKey := range infoFlags {
		flagKeys = append(flagKeys, flagKey)
	}

	trimPrefix := false
	uppercaseFirstCharacter := true
	return common.ReportSingleApp("scheduler-k3s", appName, "", infoFlags, flagKeys, format, trimPrefix, uppercaseFirstCharacter)
}

func reportComputedDeployTimeout(appName string) string {
	return getComputedDeployTimeout(appName)
}

func reportDeployTimeout(appName string) string {
	return getDeployTimeout(appName)
}

func reportGlobalDeployTimeout(appName string) string {
	return getGlobalDeployTimeout()
}

func reportComputedImagePullSecrets(appName string) string {
	return getComputedImagePullSecrets(appName)
}

func reportImagePullSecrets(appName string) string {
	return getImagePullSecrets(appName)
}

func reportGlobalImagePullSecrets(appName string) string {
	return getGlobalImagePullSecrets()
}

func reportGlobalIngressClass(appName string) string {
	return getGlobalIngressClass()
}

func reportGlobalKubeconfigPath(appName string) string {
	return getKubeconfigPath()
}

func reportGlobalKubeContext(appName string) string {
	return getKubeContext()
}
func reportComputedLetsencryptServer(appName string) string {
	return getComputedLetsencryptServer(appName)
}

func reportLetsencryptServer(appName string) string {
	return getLetsencryptServer(appName)
}

func reportGlobalLetsencryptServer(appName string) string {
	return getGlobalLetsencryptServer()
}

func reportGlobalLetsencryptEmailProd(appName string) string {
	return getGlobalLetsencryptEmailProd()
}

func reportGlobalLetsencryptEmailStag(appName string) string {
	return getGlobalLetsencryptEmailStag()
}

func reportComputedKustomizeRootPath(appName string) string {
	return getComputedKustomizeRootPath(appName)
}

func reportKustomizeRootPath(appName string) string {
	return getKustomizeRootPath(appName)
}

func reportGlobalKustomizeRootPath(appName string) string {
	return getGlobalKustomizeRootPath()
}

func reportComputedNamespace(appName string) string {
	return getComputedNamespace(appName)
}

func reportNamespace(appName string) string {
	return getNamespace(appName)
}

func reportGlobalNamespace(appName string) string {
	return getGlobalNamespace()
}

func reportGlobalNetworkInterface(appName string) string {
	return getGlobalNetworkInterface()
}

func reportComputedRollbackOnFailure(appName string) string {
	return getComputedRollbackOnFailure(appName)
}

func reportRollbackOnFailure(appName string) string {
	return getRollbackOnFailure(appName)
}

func reportGlobalRollbackOnFailure(appName string) string {
	return getGlobalRollbackOnFailure()
}

func reportComputedShmSize(appName string) string {
	return getComputedShmSize(appName)
}

func reportGlobalShmSize(appName string) string {
	return getGlobalShmSize()
}

func reportShmSize(appName string) string {
	return getShmSize(appName)
}
