package collector

import (
	"context"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/samber/lo"
	"github.com/tidbcloud/dataflow-service/app/container"
	backup_metric "github.com/tidbcloud/dataflow-service/app/metrics/backup/metric"
	"github.com/tidbcloud/dataflow-service/app/metrics/base"
	backup_repo "github.com/tidbcloud/dataflow-service/app/repo/backup"
	"github.com/tidbcloud/dataflow-service/app/repo/entity"
)

func NewBackupMetricsCollector() prometheus.Collector {
	app := container.Global()
	unfinishedStatus := []entity.BackupStatus{entity.BackupStatusPending, entity.BackupStatusRunning}

	return base.NewMetricsCollector(&base.Target[*entity.Backup]{
		Name:            "backup",
		StatusCollector: backup_metric.BackupStatusDesc,
		ListUnfinished: func(ctx context.Context) ([]*entity.Backup, error) {
			return app.BackupRepo.ListByFilter(ctx, backup_repo.BackupFilter{
				Statuses: unfinishedStatus,
			})
		},
		ListByIDs: func(ctx context.Context, ids []entity.ID) ([]*entity.Backup, error) {
			if len(ids) == 0 {
				return nil, nil
			}

			backups, err := app.BackupRepo.List(ctx, func(qs entity.BackupQuerySet) entity.BackupQuerySet {
				return qs.IDIn(ids...)
			})
			return lo.ToSlicePtr(backups), err
		},
		UpdateStatusMetrics: func(collector *prometheus.Desc, obj *entity.Backup) {
			backup_metric.UpdateBackupStatusMetric(obj)
		},
		DeleteStatusMetrics: backup_metric.DeleteBackupStatusMetric,
	})
}
