package redis_test

import (
	"context"
	"strings"
	"testing"

	miniredis "github.com/alicebob/miniredis/v2"

	"bit.admedia.com/scm/ad/adpilot-indexing-repo-sync.com/internal/config"
	redisclient "bit.admedia.com/scm/ad/adpilot-indexing-repo-sync.com/internal/redis"
)

func TestNewInvalidURL(t *testing.T) {
	_, err := redisclient.New(config.RedisConfig{URL: "://invalid"})
	if err == nil {
		t.Fatal("expected error for invalid redis url")
	}
}

func TestPingAndReady(t *testing.T) {
	server, err := miniredis.Run()
	if err != nil {
		t.Fatalf("start miniredis: %v", err)
	}
	defer server.Close()

	client, err := redisclient.New(config.RedisConfig{URL: "redis://" + server.Addr()})
	if err != nil {
		t.Fatalf("new client: %v", err)
	}
	defer client.Close()

	ctx := context.Background()
	if err := client.Ping(ctx); err != nil {
		t.Fatalf("ping: %v", err)
	}
	if !client.Ready(ctx) {
		t.Fatal("expected client to be ready")
	}
}

func TestReadyAfterServerStop(t *testing.T) {
	server, err := miniredis.Run()
	if err != nil {
		t.Fatalf("start miniredis: %v", err)
	}

	client, err := redisclient.New(config.RedisConfig{URL: "redis://" + server.Addr()})
	if err != nil {
		t.Fatalf("new client: %v", err)
	}
	defer client.Close()

	server.Close()

	if client.Ready(context.Background()) {
		t.Fatal("expected client to be not ready after server stop")
	}
}

func TestCloseNilSafe(t *testing.T) {
	var client *redisclient.Client
	if err := client.Close(); err != nil {
		t.Fatalf("close nil client: %v", err)
	}
}

func TestUnderlyingNotNil(t *testing.T) {
	server, err := miniredis.Run()
	if err != nil {
		t.Fatalf("start miniredis: %v", err)
	}
	defer server.Close()

	client, err := redisclient.New(config.RedisConfig{URL: "redis://" + server.Addr()})
	if err != nil {
		t.Fatalf("new client: %v", err)
	}
	defer client.Close()

	if client.Underlying() == nil {
		t.Fatal("expected underlying client")
	}
}

func TestNewUsesConfiguredURL(t *testing.T) {
	server, err := miniredis.Run()
	if err != nil {
		t.Fatalf("start miniredis: %v", err)
	}
	defer server.Close()

	url := "redis://" + server.Addr()
	client, err := redisclient.New(config.RedisConfig{URL: url})
	if err != nil {
		t.Fatalf("new client: %v", err)
	}
	defer client.Close()

	if !strings.HasPrefix(url, "redis://") {
		t.Fatalf("unexpected url: %s", url)
	}
}
