package loader

import (
	"context"
	"fmt"
	"os"

	"gopkg.in/yaml.v3"

	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/logger"
)

type ConfigurationSourceFile[T any] struct {
	filepath string
}

func NewConfigurationSourceFile[T any](filePath string) *ConfigurationSourceFile[T] {
	return &ConfigurationSourceFile[T]{
		filepath: filePath,
	}
}

func (s *ConfigurationSourceFile[T]) Load(ctx context.Context, _ *T) (*T, error) {
	if s.filepath == "" {
		logger.FromContext(ctx).Info("no config file path provided, skipping file source")
		return nil, nil
	}

	logger.FromContext(ctx).Info("loading config from file", "path", s.filepath)

	data, err := os.ReadFile(s.filepath)
	if err != nil {
		return nil, fmt.Errorf("failed to read config file: %w", err)
	}

	conf := new(T)
	if err := yaml.Unmarshal(data, conf); err != nil {
		return nil, fmt.Errorf("failed to unmarshal config: %w", err)
	}

	return conf, nil
}
