package queue

import (
	"reflect"
	"time"

	"forge.cadoles.com/cadoles/bouncer/internal/store"
	"github.com/mitchellh/mapstructure"
	"github.com/pkg/errors"
)

type LayerOptions struct {
	Capacity  int64         `mapstructure:"capacity"`
	KeepAlive time.Duration `mapstructure:"keepAlive"`
	MatchURLs []string      `mapstructure:"matchURLs"`
}

func fromStoreOptions(storeOptions store.LayerOptions, defaultKeepAlive time.Duration) (*LayerOptions, error) {
	layerOptions := LayerOptions{
		Capacity:  1000,
		KeepAlive: defaultKeepAlive,
		MatchURLs: []string{"*"},
	}

	config := mapstructure.DecoderConfig{
		DecodeHook: stringToDurationHook,
		Result:     &layerOptions,
	}

	decoder, err := mapstructure.NewDecoder(&config)
	if err != nil {
		return nil, err
	}

	if err := decoder.Decode(storeOptions); err != nil {
		return nil, errors.WithStack(err)
	}

	return &layerOptions, nil
}

func stringToDurationHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) {
	if t == reflect.TypeOf(*new(time.Duration)) && f == reflect.TypeOf("") {
		return time.ParseDuration(data.(string))
	}

	return data, nil
}