package redis

import (
	"context"
	"fmt"
	"time"

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

	"vul-backend/internal/config"
)

func New(cfg config.RedisConfig) (*goredis.Client, error) {
	if cfg.Addr == "" {
		return nil, nil
	}

	client := goredis.NewClient(&goredis.Options{
		Addr:        cfg.Addr,
		Password:    cfg.Password,
		DB:          cfg.DB,
		DialTimeout: durationOrDefault(cfg.DialTimeout, 5*time.Second),
		ReadTimeout: durationOrDefault(cfg.ReadTimeout, 3*time.Second),
		WriteTimeout: durationOrDefault(cfg.WriteTimeout,
			3*time.Second),
	})

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	if err := client.Ping(ctx).Err(); err != nil {
		return nil, fmt.Errorf("ping redis: %w", err)
	}

	return client, nil
}

func durationOrDefault(input time.Duration, fallback time.Duration) time.Duration {
	if input <= 0 {
		return fallback
	}
	return input
}
