package config

import (
	"io/ioutil"
	"local/args"
	"os"
	"time"
)

type Config struct {
	Port         int
	DBURI        string
	Database     string
	DriverType   string
	FilePrefix   string
	FileRoot     string
	Auth         bool
	AuthLifetime time.Duration
	MaxFileSize  int64
	RPS          int
	SysRPS       int
	Delay        time.Duration
}

func New() Config {
	as := args.NewArgSet()

	f, err := ioutil.TempFile(os.TempDir(), "bolt.db.*")
	if err != nil {
		panic(err)
	}
	f.Close()

	as.Append(args.INT, "p", "port to listen on", 18114)
	as.Append(args.STRING, "dburi", "database uri", f.Name())
	as.Append(args.STRING, "fileprefix", "path prefix for file service", "/__files__")
	as.Append(args.STRING, "fileroot", "path to file hosting root", "/tmp/")
	as.Append(args.STRING, "database", "database name to use", "db")
	as.Append(args.STRING, "driver-type", "database driver to use, [boltdb mongo map]", "map")
	as.Append(args.BOOL, "auth", "check for authorized access", false)
	as.Append(args.DURATION, "authlifetime", "duration auth is valid for", time.Hour)
	as.Append(args.DURATION, "delay", "time to delay requests", time.Duration(0))
	as.Append(args.INT, "max-file-size", "max file size for uploads in bytes", 50*(1<<20))
	as.Append(args.INT, "rps", "rps per namespace", 5)
	as.Append(args.INT, "sys-rps", "rps for the sys", 10)

	if err := as.Parse(); err != nil {
		os.Remove(f.Name())
		panic(err)
	}

	return Config{
		Port:         as.GetInt("p"),
		DBURI:        as.GetString("dburi"),
		FilePrefix:   as.GetString("fileprefix"),
		FileRoot:     as.GetString("fileroot"),
		Database:     as.GetString("database"),
		DriverType:   as.GetString("driver-type"),
		Auth:         as.GetBool("auth"),
		AuthLifetime: as.GetDuration("authlifetime"),
		Delay:        as.GetDuration("delay"),
		MaxFileSize:  int64(as.GetInt("max-file-size")),
		RPS:          as.GetInt("rps"),
		SysRPS:       as.GetInt("sys-rps"),
	}
}
