package config

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"

	"gopkg.in/yaml.v3"
)

type Config struct {
	Service struct {
		LogLevel string `yaml:"log_level"`
	} `yaml:"service"`

	Kafka struct {
		Host            string `yaml:"host"`
		Port            string `yaml:"port"`
		OrderTopic      string `yaml:"order_topic"`
		ConsumerGroupID string `yaml:"consumer_group_id"`
		Brokers         string `yaml:"brokers"`
	} `yaml:"kafka"`
}

func LoadConfig(filename string) (*Config, error) {
	workDir, err := os.Getwd()
	if err != nil {
		return nil, err
	}
	cfgRoot := filepath.Join(workDir, "configs")
	absCfgRoot, _ := filepath.Abs(cfgRoot)

	filePath := filepath.Join(absCfgRoot, filepath.Clean(filename))
	if !strings.HasPrefix(filePath, absCfgRoot) {
		return nil, fmt.Errorf("invalid path")
	}

	f, err := os.Open(filename)
	if err != nil {
		return nil, err
	}
	defer f.Close()

	config := &Config{}
	if err := yaml.NewDecoder(f).Decode(config); err != nil {
		return nil, err
	}

	return config, nil
}
