// Package redis provides a process-wide Redis client (one connection pool per Addr).
// Construct once in svc.ServiceContext and inject into model repositories / use cases.
package redis

import (
	"fmt"

	"github.com/zeromicro/go-zero/core/stores/redis"
)

// Client wraps go-zero Redis so all modules share the same connection pool.
type Client struct {
	r *redis.Redis
	pubSubFields
}

// NewClient returns a shared Redis client, or (nil, nil) when Host is empty.
func NewClient(conf redis.RedisConf) (*Client, error) {
	if conf.Host == "" {
		return nil, nil
	}
	if err := conf.Validate(); err != nil {
		return nil, fmt.Errorf("redis: invalid config: %w", err)
	}
	return &Client{r: redis.MustNewRedis(conf)}, nil
}

// MustNewClient is like NewClient but panics on error (startup wiring).
func MustNewClient(conf redis.RedisConf) *Client {
	c, err := NewClient(conf)
	if err != nil {
		panic(err)
	}
	return c
}

// Zero returns the underlying go-zero Redis handle.
func (c *Client) Zero() *redis.Redis {
	if c == nil {
		return nil
	}
	return c.r
}
