package collector

import (
	"context"

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

func NewCompactBackupMetricsCollector() prometheus.Collector {
	app := container.Global()
	activeStatuses := []entity.CompactBackupStatus{
		entity.CompactBackupStatusPending,
		entity.CompactBackupStatusRunning,
		entity.CompactBackupStatusDeleting,
	}

	return base.NewMetricsCollector(&base.Target[*entity.CompactBackup]{
		Name:            "compact_backup",
		StatusCollector: compact_metric.CompactBackupStatusDesc,
		ListUnfinished: func(ctx context.Context) ([]*entity.CompactBackup, error) {
			result, bErr := app.CompactBackupRepo.ListByFilter(ctx, &backup_repo.CompactBackupFilter{
				Statuses: activeStatuses,
			})
			return result, bErr
		},
		ListByIDs: func(ctx context.Context, ids []entity.ID) ([]*entity.CompactBackup, error) {
			if len(ids) == 0 {
				return nil, nil
			}
			result, bErr := app.CompactBackupRepo.ListByFilter(ctx, &backup_repo.CompactBackupFilter{
				IDs: ids,
			})
			return result, bErr
		},
		UpdateStatusMetrics: func(_ *prometheus.Desc, obj *entity.CompactBackup) {
			compact_metric.UpdateCompactBackupStatusMetric(obj)
		},
		DeleteStatusMetrics: compact_metric.DeleteCompactBackupStatusMetric,
	})
}
