package config

import (
	_ "embed"
	"github.com/BurntSushi/toml"
	"github.com/pingcap-inc/checker/proto"
	"github.com/sirupsen/logrus"
)

//go:embed rule_beta.toml
var betaRuleStr string

type RuleSpec struct {
	Rule []struct {
		proto.Rule `yaml:",inline"`
		Version    proto.VersionRange `yaml:"version" toml:"version"`
	} `yaml:"rule" toml:"rule"`
}

func (rs *RuleSpec) FilterOnVersion(ver string) (proto.RuleSet, error) {
	rSet := proto.RuleSet{}
	for idx, _ := range rs.Rule {
		ok, err := rs.Rule[idx].Version.Contain(ver)
		if err != nil {
			return nil, err
		}
		if !ok {
			continue
		}
		// set match rule to rSet
		name:= rs.Rule[idx].NameStruct
		if _, ok := rSet[name]; !ok {
			rSet[name] = make([]*proto.Rule,0)
		}
		rSet[name] = append(rSet[name], &rs.Rule[idx].Rule)
	}
	return rSet, nil
}

func LoadBetaRuleSpec() (*RuleSpec, error) {
	ruleSpec := &RuleSpec{Rule: []struct {
		proto.Rule `yaml:",inline"`
		Version    proto.VersionRange `yaml:"version" toml:"version"`
	}{}}
	if _, err := toml.Decode(betaRuleStr, ruleSpec); err != nil {
		logrus.Fatal(err)
	}
	return ruleSpec, nil
}
