package middleware

import (
	"reflect"

	"github.com/ngaut/log"
	"github.com/pingcap/schrodinger/notifiermgr/event"
)

func match(configPtr *interface{}) Middleware {
	input := make(chan event.Event)
	output := make(chan event.Event)

	if configPtr == nil {
		log.Error("config of match middleware is nil")
		return nil
	}
	config, ok := (*configPtr).(map[interface{}]interface{})
	if !ok {
		log.Warn("config of match middleware is not a map")
	}

	go func() {
		for event := range input {
			reflectValue := reflect.ValueOf(event)

			for key, expectedValue := range config {
				key, ok := key.(string)
				if !ok {
					log.Error("key of match config should be string")
					continue
				}
				field := reflect.Indirect(reflectValue).FieldByName(key)
				if !reflect.DeepEqual(expectedValue, field) {
					continue
				}
			}

			output <- event
		}
	}()

	return &RealMiddleware{
		input,
		output,
	}
}
