package handler

import (
	"github.com/unistack-org/micro/v3/api/router"
	"github.com/unistack-org/micro/v3/client"
	"github.com/unistack-org/micro/v3/logger"
)

// DefaultMaxRecvSize specifies max recv size for handler
var DefaultMaxRecvSize int64 = 1024 * 1024 * 100 // 10Mb

// Options struct holds handler options
type Options struct {
	Router      router.Router
	Client      client.Client
	Logger      logger.Logger
	Namespace   string
	MaxRecvSize int64
}

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

// NewOptions creates new options struct and fills it
func NewOptions(opts ...Option) Options {
	options := Options{
		Client:      client.DefaultClient,
		Router:      router.DefaultRouter,
		Logger:      logger.DefaultLogger,
		MaxRecvSize: DefaultMaxRecvSize,
	}
	for _, o := range opts {
		o(&options)
	}

	// set namespace if blank
	if len(options.Namespace) == 0 {
		WithNamespace("go.micro.api")(&options)
	}

	return options
}

// WithNamespace specifies the namespace for the handler
func WithNamespace(s string) Option {
	return func(o *Options) {
		o.Namespace = s
	}
}

// WithRouter specifies a router to be used by the handler
func WithRouter(r router.Router) Option {
	return func(o *Options) {
		o.Router = r
	}
}

// WithClient specifies client to be used by the handler
func WithClient(c client.Client) Option {
	return func(o *Options) {
		o.Client = c
	}
}

// WithMaxRecvSize specifies max body size
func WithMaxRecvSize(size int64) Option {
	return func(o *Options) {
		o.MaxRecvSize = size
	}
}