package hook

import (
	"fmt"
	"time"

	"github.com/prometheus/client_golang/prometheus"
	crrf_metric "github.com/tidbcloud/dataflow-service/app/metrics/crrf/metric"
	"github.com/tidbcloud/dataflow-service/app/repo/entity"
	"gorm.io/gorm"
)

type crrfMetricsHooker struct{}

var _ entity.DataflowEventHooker = (*crrfMetricsHooker)(nil)

func NewCRRFMetricsHooker() *crrfMetricsHooker {
	return &crrfMetricsHooker{}
}

func (b *crrfMetricsHooker) BeforeSave(tx *gorm.DB, v interface{}) {
}

func (b *crrfMetricsHooker) AfterSave(tx *gorm.DB, v interface{}) {
	crrf, ok := v.(*entity.CRRFSetting)
	if !ok {
		return
	}
	crrf_metric.UpdateStatusMetric(crrf)
	// delete the metrics of the CRRF setting that is deleted.
	// note that prometheus will scrape the metrics every 1 minute, so we delete the metrics after 2 minute
	// to make sure prometheus has scraped the metrics
	// we may introduce worker pool to do this job in the future(check goroutine metrics in after launch this feature)
	if !crrf.DeletedAt.Time.IsZero() {
		go func() {
			time.Sleep(crrf_metric.WaitMetricScrapeInterval)
			crrf_metric.Status.DeletePartialMatch(
				prometheus.Labels{crrf_metric.IDLabel: fmt.Sprintf("%d", crrf.ID)})
		}()
	}
}

func (b *crrfMetricsHooker) Type() entity.DataflowEventType {
	return entity.CRRFDisplayType
}
