//
// config.go
// Copyright (C) 2017 kevin <kevin@phrye.com>
//
// Distributed under terms of the GPL license.
//

package config

import (
	"github.com/spf13/pflag"
	"github.com/spf13/viper"
)

// Config for storing configuration.
type Config struct {
	ListenAddress string `mapstructure:"listen_address"`
	Device        string `mapstructure:"device"`
	Model         string `mapstructure:"model"`
	TemplateDir   string `mapstructure:"template_dir"`
	StaticDir     string `mapstructure:"static_dir"`
	SleepCycle    int64  `mapstructure:"sleep_cycle"`
}

func setDefaults() {
	viper.BindPFlag("listen_address", pflag.Lookup("listen-address"))
	viper.BindPFlag("device", pflag.Lookup("device"))
	viper.BindPFlag("model", pflag.Lookup("model"))
	viper.BindPFlag("template_dir", pflag.Lookup("template-dir"))
	viper.BindPFlag("static_dir", pflag.Lookup("static-dir"))
	viper.BindPFlag("sleep_cycle", pflag.Lookup("sleep-cycle"))
}

// ReadConfig reads the client configuration from a file into a Config struct.
func ReadConfig(cfg string) (*Config, error) {
	setDefaults()
	viper.SetConfigFile(cfg)
	viper.SetConfigType("hcl")
	if err := viper.ReadInConfig(); err != nil {
		return nil, err
	}
	c := &Config{}
	if err := viper.Unmarshal(c); err != nil {
		return nil, err
	}
	return c, nil
}