package taskqueuetester

import (
	"context"
	"fmt"

	"github.com/tidbcloud/metrics-integration/pipeline/internal/otel_collector/extension/taskqueue"
	"go.opentelemetry.io/collector/component"
	"go.opentelemetry.io/collector/consumer"
	"go.opentelemetry.io/collector/pdata/pmetric"
	"go.opentelemetry.io/collector/processor"
	"go.uber.org/zap"
)

type taskQueueTester struct {
	tQueue       taskqueue.TaskQueueExtension
	cancel       context.CancelFunc
	logger       *zap.Logger
	nextConsumer consumer.Metrics
	config       *Config
}

func newTaskQueueTester(logger *zap.Logger, config *Config, settings processor.Settings) (*taskQueueTester, error) {
	return &taskQueueTester{}, nil
}

func (tTester *taskQueueTester) do(ctx context.Context, md pmetric.Metrics) (pmetric.Metrics, error) {
	task, ok := taskqueue.GetTaskFromContext(ctx)
	if !ok {
		return md, fmt.Errorf("cannot find task struct in context")
	}

	if err := tTester.tQueue.Ack(*task); err != nil {
		return md, err
	}

	return md, nil
}

func (tTester *taskQueueTester) start(ctx context.Context, host component.Host) error {
	taskQueueExt, ok := host.GetExtensions()[tTester.config.TaskQueueExtID]
	if !ok {
		return fmt.Errorf("failed to get taskqueue extension")
	}

	tq, ok := taskQueueExt.(taskqueue.TaskQueueExtension)
	if !ok {
		return fmt.Errorf("taskqueue extension is not of TaskQueue type")
	}

	tTester.tQueue = tq

	return nil
}
