package middleware

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

// Serializable is an interface for serialize event
type Serializable interface {
	Serialize() string
}

// Notification is a struct used by next middleware/sink
type Notification struct {
	Content string
}

func serialize(raw event.Event) event.Event {
	content, ok := raw.(Serializable)
	if !ok {
		log.Error("Serialize an unserializable struct")
		return nil
	}

	return Notification{
		Content: content.Serialize(),
	}
}

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

	go func() {
		for event := range input {
			output <- serialize(event)
		}
	}()

	return &RealMiddleware{
		input,
		output,
	}
}
