package serverruntime

import (
	"context"
	"database/sql"
	"errors"
	"sync/atomic"
	"testing"
	"time"

	database "github.com/nexuscrm/db"
	"github.com/prometheus/client_golang/prometheus/testutil"
)

func TestAPIQueueObservationDoesNotOpenPoolBeforeFirstTick(t *testing.T) {
	var opens atomic.Int32
	stop := startAPIQueueObservationSamplerWithConfig(
		t.Context(),
		func(database.PoolOptions) (*sql.DB, error) {
			opens.Add(1)
			return nil, errors.New("unexpected open")
		},
		time.Hour,
		time.Second,
		[]apiQueueObservationSource{{name: "no_startup_read", refresh: func(context.Context, *sql.DB) error {
			return errors.New("unexpected refresh")
		}}},
	)
	stop()
	if got := opens.Load(); got != 0 {
		t.Fatalf("independent pool opens before first tick = %d, want 0", got)
	}
}

func TestAPIQueueObservationInitializesFreshnessBeforeFirstTick(t *testing.T) {
	connectorQueue := newConnectorQueueObservation()
	stop := startAPIQueueObservationSamplerWithConfig(
		t.Context(),
		nil,
		time.Hour,
		time.Second,
		apiQueueObservationSources(connectorQueue),
	)
	defer stop()

	for _, queue := range []string{"outbox", "rollup_delta", connectorQueueObservationSourceName} {
		if got := testutil.ToFloat64(apiQueueObservationLastSuccess.WithLabelValues(queue)); got != 0 {
			t.Fatalf("%s last-success timestamp = %v before first tick, want 0", queue, got)
		}
		if got := testutil.ToFloat64(apiQueueObservationStale.WithLabelValues(queue)); got != 1 {
			t.Fatalf("%s stale metric = %v before first tick, want 1", queue, got)
		}
	}
	_, available, stale, lastSuccess := connectorQueue.ConnectorQueueSnapshot()
	if available || !stale || !lastSuccess.IsZero() {
		t.Fatalf(
			"connector snapshot before first tick available=%v stale=%v last_success=%s, want unavailable stale zero",
			available,
			stale,
			lastSuccess,
		)
	}
}
