package tier

import (
	"fmt"
	"os"

	"sigs.k8s.io/yaml"

	"github.com/tidbcloud/cluster-service-ng/internal/capacity-planner/api/v1alpha1"
)

// LoadTemplatesFile reads and validates tier templates from a YAML config file.
func LoadTemplatesFile(path string) (*v1alpha1.TierTemplates, error) {
	data, err := os.ReadFile(path)
	if err != nil {
		return nil, fmt.Errorf("read tier templates config %q: %w", path, err)
	}
	templates, err := ParseTemplatesConfig(data)
	if err != nil {
		return nil, fmt.Errorf("load tier templates config %q: %w", path, err)
	}
	return templates, nil
}

// ParseTemplatesConfig parses and validates tier templates YAML config.
func ParseTemplatesConfig(data []byte) (*v1alpha1.TierTemplates, error) {
	var templates v1alpha1.TierTemplates
	if err := yaml.UnmarshalStrict(data, &templates); err != nil {
		return nil, fmt.Errorf("parse YAML: %w", err)
	}
	if err := ValidateTemplates(&templates); err != nil {
		return nil, err
	}
	return &templates, nil
}

// ValidateTemplates validates reusable tier templates without materializing
// autoscaler tiers. It is intended for startup config validation.
func ValidateTemplates(templates *v1alpha1.TierTemplates) error {
	compiled, err := compileTemplates(templates)
	if err != nil {
		return err
	}
	if len(compiled) == 0 {
		return fmt.Errorf("tier: templates are required")
	}
	return nil
}
