package main

import (
	"path/filepath"

	"github.com/sirupsen/logrus"
	"github.com/spf13/cobra"
	"github.com/tidbcloud/cluster-tier-config/script/model"
)

type deprecatedTierUnitCheckerParams struct {
	enableWhitelist bool
}

func newUsingDeprecatedTierUnitChecker() *cobra.Command {
	params := &deprecatedTierUnitCheckerParams{}
	cmd := &cobra.Command{
		Use:   "check-using-deprecated-tier-unit",
		Short: "check using of deprecated tier unit",
		Run: func(cmd *cobra.Command, args []string) {
			checkDeprecatedTierUnit(params)
		},
	}
	cmd.Flags().BoolVar(&params.enableWhitelist, "enable-whitelist", true, "whether enable whitelist")

	return cmd
}

func checkDeprecatedTierUnit(params *deprecatedTierUnitCheckerParams) {
	fullPath, _ := filepath.Abs(yamlDir)

	key2Tier := tiers2Key2Tier(readTiers(yamlDir))
	key2TierUnits := tierUnits2Key2TierUnit(readTierUnits(yamlDir))
	logrus.Infof("run checkDeprecatedTierUnit in %s, len(tiers)=%d, len(tierUnits)=%d", fullPath, len(key2Tier), len(key2TierUnits))

	checkWhetherUseDeprecatedTierUnit(key2Tier, key2TierUnits, params)
}

func checkWhetherUseDeprecatedTierUnit(key2Tier map[string]*model.TierYaml, key2TierUnit map[string]*model.TierUnitYaml, params *deprecatedTierUnitCheckerParams) {
	var someFailure bool

	for tierKey, tier := range key2Tier {
		for provider, mappings := range tier.TierUnitMap {
			for _, mapping := range mappings {
				if _, ok := key2TierUnit[mapping.TierUnitKey]; !ok {
					logrus.Warnf("use deprecated tier unit(%s) in provider(%s) in tier(%s)", mapping.TierUnitKey, provider, tierKey)
					someFailure = true
				} else {
					logrus.Debugf("tier unit(%s) used in provider(%s) in tier(%s) is ok", mapping.TierUnitKey, provider, tierKey)
				}
			}
		}
	}

	if someFailure {
		logrus.Fatalf("some tiers are using deprecated tier units")
	} else {
		logrus.Infof("checkWhetherUseDeprecatedTierUnit passed\n")
	}
}
