package main

import (
	"io/ioutil"
	"path"
	"strings"

	"github.com/samber/lo"
	"github.com/tidbcloud/cluster-tier-config/script/model"
	"gopkg.in/yaml.v2"
)

func readTiers(yamlDir string) []*model.TierYaml {
	fs, err := ioutil.ReadDir(yamlDir)
	if err != nil {
		panic(err)
	}
	var data []byte
	for _, f := range fs {
		if strings.HasSuffix(f.Name(), ".yaml") && strings.HasPrefix(f.Name(), tierFilenamePrefix) {
			b, err := ioutil.ReadFile(path.Join(yamlDir, f.Name()))
			if err != nil {
				panic(err)
			}
			data = append(data, b...)
			data = append(data, []byte("\r\n")...)
		}
	}

	var tiers []*model.TierYaml
	err = yaml.Unmarshal(data, &tiers)
	if err != nil {
		panic(err)
	}

	return tiers
}

func readTierUnits(yamlDir string) []*model.TierUnitYaml {
	fs, err := ioutil.ReadDir(yamlDir)
	if err != nil {
		panic(err)
	}
	var data []byte
	for _, f := range fs {
		if strings.HasSuffix(f.Name(), ".yaml") && strings.HasPrefix(f.Name(), tierUnitFilenamePrefix) {
			b, err := ioutil.ReadFile(path.Join(yamlDir, f.Name()))
			if err != nil {
				panic(err)
			}
			data = append(data, b...)
			data = append(data, []byte("\r\n")...)
		}
	}

	var tierUnits []*model.TierUnitYaml
	err = yaml.Unmarshal(data, &tierUnits)
	if err != nil {
		panic(err)
	}

	return tierUnits
}

func tierUnits2Key2TierUnit(tierUnits []*model.TierUnitYaml) map[string]*model.TierUnitYaml {
	return lo.SliceToMap[*model.TierUnitYaml, string, *model.TierUnitYaml](tierUnits, func(item *model.TierUnitYaml) (string, *model.TierUnitYaml) {
		return item.Key, item
	})
}

func tiers2Key2Tier(tiers []*model.TierYaml) map[string]*model.TierYaml {
	return lo.SliceToMap[*model.TierYaml, string, *model.TierYaml](tiers, func(item *model.TierYaml) (string, *model.TierYaml) {
		return model.BuildTierKey(item.Name, item.DeployType, item.ComponentType), item
	})
}
