package zero

import (
	"fmt"
	"net/http"
	"time"
)

// Option is a functional option for the SDK
type Option func(*config)

type config struct {
	clusterAPIEndpoint  string
	connectAPIEndpoint  string
	otelEndpoint        string
	apiToken            string
	httpClient          *http.Client
	downloadURLCacheTTL time.Duration
}

// WithClusterAPIEndpoint sets the cluster API endpoint
func WithClusterAPIEndpoint(endpoint string) Option {
	return func(cfg *config) {
		cfg.clusterAPIEndpoint = endpoint
	}
}

// WithConnectAPIEndpoint sets the connect API endpoint
func WithConnectAPIEndpoint(endpoint string) Option {
	return func(cfg *config) {
		cfg.connectAPIEndpoint = endpoint
	}
}

// WithOTELEndpoint sets the OTEL API endpoint
func WithOTELEndpoint(endpoint string) Option {
	return func(cfg *config) {
		cfg.otelEndpoint = endpoint
	}
}

// WithAPIToken sets the API token
func WithAPIToken(token string) Option {
	return func(cfg *config) {
		cfg.apiToken = token
	}
}

// WithHTTPClient sets the HTTP client
func WithHTTPClient(client *http.Client) Option {
	return func(cfg *config) {
		cfg.httpClient = client
	}
}

// WithDownloadURLCacheTTL sets the minimum TTL for download URL cache entries
func WithDownloadURLCacheTTL(ttl time.Duration) Option {
	return func(cfg *config) {
		cfg.downloadURLCacheTTL = ttl
	}
}

func newConfig(opts ...Option) (*config, error) {
	cfg := new(config)
	for _, opt := range []Option{
		WithHTTPClient(http.DefaultClient),
		WithDownloadURLCacheTTL(15 * time.Minute),
	} {
		opt(cfg)
	}

	for _, opt := range opts {
		opt(cfg)
	}
	if err := cfg.validate(); err != nil {
		return nil, err
	}
	return cfg, nil
}

func (c *config) validate() error {
	if c.clusterAPIEndpoint == "" {
		return fmt.Errorf("cluster API endpoint is required")
	}
	if c.connectAPIEndpoint == "" {
		return fmt.Errorf("connect API endpoint is required")
	}
	if c.otelEndpoint == "" {
		return fmt.Errorf("OTEL API endpoint is required")
	}
	if c.apiToken == "" {
		return fmt.Errorf("API token is required")
	}
	if c.httpClient == nil {
		return fmt.Errorf("HTTP client is required")
	}
	return nil
}