package queue

import (
	"context"
	"time"
)

// QueueMetrics represents current state of the job queue system
type QueueMetrics struct {
	QueueDepth        int64             `json:"queue_depth"`
	DLQDepth          int64             `json:"dlq_depth"`
	ActiveWorkers     int               `json:"active_workers"`
	ActiveJobs        int               `json:"active_jobs"`
	TotalProcessed    int64             `json:"total_processed"`
	TotalFailed       int64             `json:"total_failed"`
	LastProcessedAt   time.Time         `json:"last_processed_at,omitempty"`
	AvgProcessingTime string            `json:"avg_processing_time,omitempty"`
	Collector         *CollectorMetrics `json:"collector,omitempty"`
}

// GetMetrics returns current queue metrics
func (jq *JobQueue) GetMetrics(ctx context.Context) (*QueueMetrics, error) {
	queueDepth, err := jq.GetQueueDepth(ctx)
	if err != nil {
		return nil, err
	}

	dlqDepth, err := jq.GetDLQDepth(ctx)
	if err != nil {
		return nil, err
	}

	return &QueueMetrics{
		QueueDepth: queueDepth,
		DLQDepth:   dlqDepth,
		// Worker metrics will be populated by WorkerPool
	}, nil
}

// GetMetrics returns worker pool metrics
func (wp *WorkerPool) GetMetrics() *QueueMetrics {
	return &QueueMetrics{
		ActiveWorkers: wp.workerCount,
		ActiveJobs:    wp.GetActiveJobCount(),
	}
}

// MergeMetrics combines queue and worker metrics
func MergeMetrics(queueMetrics, workerMetrics *QueueMetrics) *QueueMetrics {
	if queueMetrics == nil {
		return workerMetrics
	}
	if workerMetrics == nil {
		return queueMetrics
	}

	queueMetrics.ActiveWorkers = workerMetrics.ActiveWorkers
	queueMetrics.ActiveJobs = workerMetrics.ActiveJobs
	return queueMetrics
}
