package router

import (
	"context"

	"github.com/unistack-org/micro/v3/api/resolver"
	"github.com/unistack-org/micro/v3/api/resolver/vpath"
	"github.com/unistack-org/micro/v3/logger"
	"github.com/unistack-org/micro/v3/register"
)

// Options holds the options for api router
type Options struct {
	// Register for service lookup
	Register register.Register
	// Resolver to use
	Resolver resolver.Resolver
	// Logger micro logger
	Logger logger.Logger
	// Context is for external options
	Context context.Context
	// Handler name
	Handler string
}

// Option func signature
type Option func(o *Options)

// NewOptions returns options struct filled by opts
func NewOptions(opts ...Option) Options {
	options := Options{
		Context: context.Background(),
		Handler: "meta",
	}

	for _, o := range opts {
		o(&options)
	}

	if options.Resolver == nil {
		options.Resolver = vpath.NewResolver(
			resolver.WithHandler(options.Handler),
		)
	}

	return options
}

// WithContext sets the context
func WithContext(ctx context.Context) Option {
	return func(o *Options) {
		o.Context = ctx
	}
}

// WithHandler sets the handler
func WithHandler(h string) Option {
	return func(o *Options) {
		o.Handler = h
	}
}

// WithRegister sets the register
func WithRegister(r register.Register) Option {
	return func(o *Options) {
		o.Register = r
	}
}

// WithResolver sets the resolver
func WithResolver(r resolver.Resolver) Option {
	return func(o *Options) {
		o.Resolver = r
	}
}