package config

import (
	"io/ioutil"
	"launchpad.net/goyaml"
)

type Config struct {
	Server        bool   // Run as server, if different than false (server)
	Ip            string // Bind address, if different than 0.0.0.0 (server)
	Port          string // listen port, if different than '7777' (server)
	MongoHost     string // mongoDB host, if different than 'localhost' (server)
	MongoDbName   string // mongoDB db name, if different than 'filesrv' (server)
	MongoUsername string // mongoDB username, if any (server)
	MongoPassword string // mongoDB password, if any (server)

	RemoteHost string // imgsrv server to push files to (client)

	Map map[string]interface{} // key/value options (not used currently)
}

// Of the configurations, provided option, return the value as a bool
func (c Config) GetBool(option string) (value bool) {
	switch c.Map[option] {
	default:
		value = false
	case "yes", "on", "true":
		value = true
	}
	return
}

// Of the configurations, provided option, return the value as a string
func (c Config) GetString(option string) (value string) {
	value, _ = c.Map[option].(string)
	return
}

func (c *Config) Merge(other *Config) error {
	if other == nil {
		return nil
	}
	if other.Server {
		c.Server = other.Server
	}
	if len(other.Ip) > 0 {
		c.Ip = other.Ip
	}
	if len(other.Port) > 0 {
		c.Port = other.Port
	}
	if len(other.Port) > 0 {
		c.Port = other.Port
	}
	if len(other.MongoHost) > 0 {
		c.MongoHost = other.MongoHost
	}
	if len(other.MongoDbName) > 0 {
		c.MongoDbName = other.MongoDbName
	}
	if len(other.MongoUsername) > 0 {
		c.MongoUsername = other.MongoUsername
	}
	if len(other.MongoPassword) > 0 {
		c.MongoPassword = other.MongoPassword
	}
	if len(other.RemoteHost) > 0 && len(c.RemoteHost) == 0 {
		c.RemoteHost = other.RemoteHost
	}
	return nil
}

// Given a filename to a YAML file, unmarshal it, and return a Config
func ReadConfigFile(filename string) (*Config, error) {
	bytes, err := ioutil.ReadFile(filename)
	if err != nil {
		return nil, err
	}

	config := Config{}
	if err = goyaml.Unmarshal(bytes, &config); err != nil {
		return nil, err
	}

	return &config, nil
}

/*
func WriteConfigFile(filename string, data []byte) (err error) {
	return
}
*/
