package main

import (
	"fmt"
	"strconv"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
	"github.com/tidbcloud/tiinf/transport/tieventbus"
)

const (
	EventType = "test-eventbus"
)

type EventData struct {
	ID int
}

func main() {
	eventbus, err := tieventbus.NewEventbusMock(tieventbus.EventbusConfig{
		AppName: "app",
	})
	if err != nil {
		panic(err)
	}
	eventbus.RegisterHandler(
		tieventbus.HandlerConfig{
			EventType: EventType,
			Group:     "consumer",
			HandleFunc: func(event *tieventbus.Event) error {
				fmt.Println(fmt.Sprintf("Recieved event(ID=%d)", event.Data.(*EventData).ID))
				return nil
			},
			DataStruct: EventData{},
		})
	registry := prometheus.NewRegistry()
	eventbus.EnableMetrics(registry, "dev", "")
	err = eventbus.Run()
	if err != nil {
		panic(err)
	}
	go func() {
		for i := 0; i != 10000; i++ {
			err := eventbus.Publish(&tieventbus.Event{
				ID:   strconv.Itoa(1),
				Type: EventType,
				Data: &EventData{
					ID: i,
				},
			})
			if err != nil {
				panic(err)
			}
			time.Sleep(1 * time.Second)
		}
	}()
	registryHandler := promhttp.HandlerFor(registry, promhttp.HandlerOpts{})
	r := gin.Default()
	rt := r.Group("/api/v1")
	rt.GET("metrics", func(context *gin.Context) {
		registryHandler.ServeHTTP(context.Writer, context.Request)
	})
	_ = r.Run("127.0.0.1:8080")
}
