// Package rc implements a remote control server and registry for rclone
//
// To register your internal calls, call rc.Add(path, function).  Your
// function should take and return a Param.  It can also return an
// error.  Use rc.NewError to wrap an existing error along with an
// http response type if another response other than 500 internal
// error is required on error.
package rc

import (
	"encoding/json"
	"io"
	_ "net/http/pprof" // install the pprof http handlers
	"time"

	libhttp "github.com/rclone/rclone/lib/http"
)

// Options contains options for the remote control server
type Options struct {
	HTTP                libhttp.Config
	Auth                libhttp.AuthConfig
	Template            libhttp.TemplateConfig
	Enabled             bool   // set to enable the server
	Serve               bool   // set to serve files from remotes
	Files               string // set to enable serving files locally
	NoAuth              bool   // set to disable auth checks on AuthRequired methods
	WebUI               bool   // set to launch the web ui
	WebGUIUpdate        bool   // set to check new update
	WebGUIForceUpdate   bool   // set to force download new update
	WebGUINoOpenBrowser bool   // set to disable auto opening browser
	WebGUIFetchURL      string // set the default url for fetching webgui
	EnableMetrics       bool   // set to disable prometheus metrics on /metrics
	JobExpireDuration   time.Duration
	JobExpireInterval   time.Duration
}

// DefaultOpt is the default values used for Options
var DefaultOpt = Options{
	HTTP:              libhttp.DefaultCfg(),
	Auth:              libhttp.DefaultAuthCfg(),
	Template:          libhttp.DefaultTemplateCfg(),
	Enabled:           false,
	JobExpireDuration: 60 * time.Second,
	JobExpireInterval: 10 * time.Second,
}

func init() {
	DefaultOpt.HTTP.ListenAddr = []string{"localhost:5572"}
}

// WriteJSON writes JSON in out to w
func WriteJSON(w io.Writer, out Params) error {
	enc := json.NewEncoder(w)
	enc.SetIndent("", "\t")
	return enc.Encode(out)
}