package redis

import (
	"context"
	"fmt"
	"time"

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

	"security-center-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,
		PoolSize: intOrDefault(cfg.PoolSize, 50),
		MinIdleConns: intOrDefault(cfg.MinIdleConns,
			10),
		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
}

func intOrDefault(input int, fallback int) int {
	if input <= 0 {
		return fallback
	}
	return input
}
