package config

import (
	"os"

	"github.com/tidbcloud/observability/vm-bench/pkg/helm"
	"gopkg.in/yaml.v2"
	"helm.sh/helm/v3/pkg/chart"
	"helm.sh/helm/v3/pkg/chart/loader"
	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
)

type RootConfig struct {
	VMAgent ChartConfig `yaml:"vmagent"`
	Stress  QueryConfig `yaml:"stress"`
}

type QueryConfig struct {
	enableRangeQuery  bool `yaml:"enableRangeQuery"`
	enableIntegration bool `yaml:"enableIntegration"`
	bigRangeFactor    int  `yaml:"bigRangeFactor"`
}

type ChartConfig struct {
	ReleaseName    string `yaml:"releaseName"`
	Namespace      string `yaml:"namespace"`
	HelmValues     map[string]interface{}
	ScrapeInterval string `yaml:"scrapeInterval"`
	HelmChartPath  string `yaml:"chartPath"`
}

func (c *ChartConfig) GetNamespace() string {
	return c.Namespace
}

func (c *ChartConfig) GetName() string {
	return c.ReleaseName
}

func (c *ChartConfig) GetCRDs() ([]*apiextensionsv1.CustomResourceDefinition, error) {
	return nil, nil
}

func (c *ChartConfig) ToHelmChart() (result *chart.Chart, err error) {
	return loader.Load(c.HelmChartPath)
}

func (c *ChartConfig) ToHelmValues() map[string]interface{} {
	return c.HelmValues
}

func (c *ChartConfig) SetHelmValues(values []byte) error {
	return yaml.Unmarshal(values, &c.HelmValues)
}

var _ helm.Package = &ChartConfig{}

func LoadRootConfig(path string) (RootConfig, error) {
	data, err := os.ReadFile(path)
	if err != nil {
		return RootConfig{}, err
	}
	var config RootConfig
	err = yaml.Unmarshal(data, &config)
	if err != nil {
		return RootConfig{}, err
	}

	return config, nil
}
