// Package redis wraps *redis.Client for cache, rate-limit and idempotency use.
// Redis never stores business truth (architecture.md §7).
package redis

import (
	"context"
	"fmt"
	"time"

	"github.com/redis/go-redis/v9"
)

// New returns a redis client; an empty URL yields a no-op client so the server
// can still boot without Redis in local dev (all calls become no-ops).
func New(url string) *redis.Client {
	if url == "" {
		return nil
	}
	opts, err := redis.ParseURL(url)
	if err != nil {
		return nil
	}
	return redis.NewClient(opts)
}

// Ping reports connectivity (used by /ready). Returns false when client is nil.
func Ping(ctx context.Context, rdb *redis.Client) error {
	if rdb == nil {
		return fmt.Errorf("redis: not configured")
	}
	ctx, cancel := context.WithTimeout(ctx, 2*time.Second)
	defer cancel()
	return rdb.Ping(ctx).Err()
}
