package tw

import (
	"net/http"
	"time"
)

const (
	defaultUserAgent = "tribalwarshelp/development"
	defaultTimeout   = 10 * time.Second
)

type EnnoblementsUseInterfaceFunc func(since time.Time) bool

type clientConfig struct {
	userAgent                    string
	client                       *http.Client
	ennoblementsUseInterfaceFunc EnnoblementsUseInterfaceFunc
}

type ClientOption func(c *clientConfig)

func newClientConfig(opts ...ClientOption) *clientConfig {
	cfg := &clientConfig{
		userAgent: defaultUserAgent,
		client: &http.Client{
			Timeout: defaultTimeout,
		},
		ennoblementsUseInterfaceFunc: func(since time.Time) bool {
			return since.After(time.Now().Add(-23 * time.Hour))
		},
	}

	for _, opt := range opts {
		opt(cfg)
	}

	return cfg
}

func WithUserAgent(ua string) ClientOption {
	return func(cfg *clientConfig) {
		cfg.userAgent = ua
	}
}

func WithHTTPClient(hc *http.Client) ClientOption {
	return func(cfg *clientConfig) {
		cfg.client = hc
	}
}

// WithEnnoblementsUseInterfaceFunc takes a function that will be called on every Client.GetEnnoblements call
// to determine whether the client should use /interface.php?func=get_conquer_extended or /map/conquer_extended.txt
// The default function checks whether since is after now() - 23h,
// if so, it calls /map/conquer_extended.txt, otherwise /interface.php?func=get_conquer_extended.
func WithEnnoblementsUseInterfaceFunc(f EnnoblementsUseInterfaceFunc) ClientOption {
	return func(cfg *clientConfig) {
		cfg.ennoblementsUseInterfaceFunc = f
	}
}
