package notification

import "strings"

// RedisKey is the notification module key prefix.
type RedisKey string

const (
	IdempotencyRedisKey RedisKey = "notif:idem"
	QuotaRedisKey       RedisKey = "notif:quota"
	RetryZSetRedisKey   RedisKey = "notif:retry:zset"
)

func (key RedisKey) With(parts ...string) RedisKey {
	if len(parts) == 0 {
		return key
	}
	return RedisKey(string(key) + ":" + strings.Join(parts, ":"))
}

func (key RedisKey) String() string {
	return string(key)
}

// GetIdempotencyRedisKey caches a prior send result: notif:idem:{tenant}:{kind}:{idempotencyKey}.
func GetIdempotencyRedisKey(tenantID, kind, idempotencyKey string) string {
	return IdempotencyRedisKey.With(tenantID, kind, idempotencyKey).String()
}

// GetQuotaRedisKey is the daily counter: notif:quota:{tenant}:{channel}:{yyyyMMdd}.
func GetQuotaRedisKey(tenantID, channel, day string) string {
	return QuotaRedisKey.With(tenantID, channel, day).String()
}

// GetRetryZSetRedisKey is the async retry schedule zset.
func GetRetryZSetRedisKey() string {
	return RetryZSetRedisKey.String()
}
