package middleware

import (
	"context"

	"github.com/juju/errors"
	"github.com/ngaut/log"
	globalConfig "github.com/pingcap/schrodinger/config"
	"github.com/pingcap/schrodinger/notifiermgr/event"
	"github.com/pingcap/schrodinger/notifiermgr/util"
	"github.com/pingcap/schrodinger/pkg/notify/slack"
)

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

	rawConfig, ok := (*configPtr).(map[string]interface{})
	if !ok {
		log.Error("config of slack is not a map")
		return nil
	}
	config := util.SimpleMap(rawConfig)

	channel := config.GetString("channel")
	username := config.GetString("username")
	token := config.GetString("token")
	title := config.GetString("title")
	if channel == nil || username == nil || token == nil || title == nil {
		return nil
	}

	go func() {
		notifier, err := slack.New(&globalConfig.Slack{
			Token:    *token,
			Channel:  *channel,
			Username: *username,
		})
		if err != nil {
			log.Error("Error while connecting to slack")
			return
		}

		for rawEvent := range input {
			notification, ok := rawEvent.(Notification)
			if !ok {
				log.Errorf("input of log is not a Notification but %T", rawEvent)
			}
			err := notifier.Notify(context.Background(), slack.Notification{
				Channel:    *channel,
				Username:   *username,
				Title:      *title,
				Text:       notification.Content,
				Color:      slack.SuccessColor, // TODO: select color with more information in notification
				MarkDownIn: []string{},
			})
			if err != nil {
				log.Error(errors.ErrorStack(err))
			}

			output <- rawEvent
		}
	}()
	return &RealMiddleware{
		input,
		output,
	}
}
