// Package config provides NTP Pool specific
// configuration tools.
package config

import (
	"net/url"
	"os"
	"strconv"
	"strings"

	"go.ntppool.org/common/logger"
)

//go:generate go tool github.com/masaushi/accessory -type Config

type Config struct {
	deploymentMode string `accessor:"getter"`

	manageHostname string `accessor:"getter"`
	manageTLS      bool

	webHostname  string `accessor:"getter"`
	webHostnames []string
	webTLS       bool

	valid bool `accessor:"getter"`
}

func New() *Config {
	c := Config{}
	c.deploymentMode = os.Getenv("deployment_mode")
	c.manageHostname = os.Getenv("manage_hostname")

	c.webHostnames = strings.Split(os.Getenv("web_hostname"), ",")
	for i, h := range c.webHostnames {
		c.webHostnames[i] = strings.TrimSpace(h)
	}
	if len(c.webHostnames) > 0 {
		c.webHostname = c.webHostnames[0]
		c.valid = true
	}

	c.manageTLS = parseBool(os.Getenv("manage_tls"))
	c.webTLS = parseBool(os.Getenv("web_tls"))

	return &c
}

func (c *Config) WebURL(path string, query *url.Values) string {
	return baseURL(c.webHostname, c.webTLS, path, query)
}

func (c *Config) ManageURL(path string, query *url.Values) string {
	return baseURL(c.manageHostname, c.webTLS, path, query)
}

func baseURL(host string, tls bool, path string, query *url.Values) string {
	uri := url.URL{}
	uri.Host = host
	if tls {
		uri.Scheme = "https"
	} else {
		uri.Scheme = "http"
	}
	uri.Path = path
	if query != nil {
		uri.RawQuery = query.Encode()
	}

	return uri.String()
}

func parseBool(s string) bool {
	switch strings.ToLower(s) {
	case "yes":
		return true
	case "y":
		return true
	case "no":
		return false
	case "n":
		return false
	case "":
		return false
	}

	t, err := strconv.ParseBool(s)
	if err != nil {
		logger.Setup().Error("could not parse bool", "string", s, "err", err)
		return false
	}

	return t
}