/*
 * Copyright (C) 2023-2024
 * Das Land Schleswig-Holstein vertreten durch den
 * Ministerpräsidenten des Landes Schleswig-Holstein
 * Staatskanzlei
 * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
 *
 * Lizenziert unter der EUPL, Version 1.2 oder - sobald
 * diese von der Europäischen Kommission genehmigt wurden -
 * Folgeversionen der EUPL ("Lizenz");
 * Sie dürfen dieses Werk ausschließlich gemäß
 * dieser Lizenz nutzen.
 * Eine Kopie der Lizenz finden Sie hier:
 *
 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
 *
 * Sofern nicht durch anwendbare Rechtsvorschriften
 * gefordert oder in schriftlicher Form vereinbart, wird
 * die unter der Lizenz verbreitete Software "so wie sie
 * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
 * ausdrücklich oder stillschweigend - verbreitet.
 * Die sprachspezifischen Genehmigungen und Beschränkungen
 * unter der Lizenz sind dem Lizenztext zu entnehmen.
 */

package config

import (
	"gopkg.in/yaml.v3"
	"log"
	"os"
	"testing"
	"fmt"
)

const (
	defaultConfig   = "config.yml"
	testFilePath = "testdata/"
	activeProfile = "ACTIVE_PROFILE"
)

type Config struct {
	Http struct {
		Server struct {
			Port int `yaml:"port"`
		} `yaml:"server"`
	} `yaml:"http"`
	Grpc struct {
		Server struct {
			Mock bool `yaml:"mock"`
			Port int  `yaml:"port"`
		} `yaml:"server"`
		Router struct {
			Port int `yaml:"port"`
		} `yaml:"router"`
	} `yaml:"grpc"`
	Logging struct {
		Level string `yaml:"level"`
	} `yaml:"logging"`
}

func LoadConfig(configFilePath ...string) Config {
	var config Config

	configFile := defaultConfig
	
	env := os.Getenv(activeProfile)
	if env != "" {
		configFile = fmt.Sprintf("config-%s.yml", env)
	}

	fp := fmt.Sprintf("config/%s", configFile)
	
	if len(configFilePath) > 0 {
		fp = configFilePath[0]
	} else if testing.Testing() {
		fp = testFilePath+configFile
	}

	file, err := os.ReadFile(fp)
	if err != nil {
		log.Fatalf("FATAL: error reading YAML file: %v", err)
	}

	err = yaml.Unmarshal(file, &config)
	if err != nil {
		log.Fatalf("FATAL: error unmarshalling YAML file: %v", err)
	}

	return config
}