package config

import (
	confLoader "git.trj.tw/golang/config-loader"
)

// Server backend config
type Server struct {
	Port       int    `yaml:"port" env:"SERVER_PORT" default:"10230"`
	BackendURL string `yaml:"backend_url" env:"SERVER_BACKEND_URL" default:"http://localhost:10230"`
}

// Database connect setting
type Database struct {
	DSN      string `yaml:"dsn" env:"DB_DSN" default:"postgres://postgres@localhost:5432/dbname"`
	MaxConn  uint   `yaml:"max_conn" env:"DB_MAX_CONN" default:"5"`
	IdleConn uint   `yaml:"idle_conn" env:"DB_IDLE_CONN" default:"2"`
}

// Redis connect setting
type Redis struct {
	Host   string `yaml:"host" env:"REDIS_HOST" default:"localhost"`
	Port   int    `yaml:"port" env:"REDIS_PORT" default:"6379"`
	Prefix string `yaml:"prefix" env:"REDIS_PREFIX"`
}

type Config struct {
	Server   Server   `yaml:"server"`
	Database Database `yaml:"database"`
	Redis    Redis    `yaml:"redis"`
}

var c *Config

func Load(p ...string) error {
	loadOpts := &confLoader.LoadOptions{FromEnv: true}

	if len(p) > 0 && p[0] != "" {
		loadOpts.ConfigFile = &confLoader.ConfigFile{
			Type: confLoader.ConfigFileTypeYAML,
			Path: p[0],
		}
	}

	c = &Config{}

	if err := confLoader.Load(c, loadOpts); err != nil {
		return err
	}

	// post loaded proc

	return nil
}

func Get() *Config {
	if c == nil {
		panic("config not init")
	}
	return c
}
