package cachekey

import (
	"strings"
	"time"
)

const (
	onlineKeyBase     = "ONLINE:"
	onlineChannelBase = "online_change"
	OnlineExpire      = time.Hour / 2
	// OnlineUserCountKey 在线人数缓存键
	onlineUserCountKeyBase = "ONLINE_USER_COUNT"
	// OnlineUserCountHistoryKey 在线人数历史缓存键
	onlineUserCountHistoryKeyBase = "ONLINE_USER_COUNT_HISTORY"
	// OnlineUserCountHistoryRetention 在线人数历史保留时长
	OnlineUserCountHistoryRetention = 60 * 24 * time.Hour
)

var (
	OnlineKey                 = onlineKeyBase
	OnlineChannel             = onlineChannelBase
	OnlineUserCountKey        = onlineUserCountKeyBase
	OnlineUserCountHistoryKey = onlineUserCountHistoryKeyBase
)

func SetOnlinePrefix(prefix string, useHashTag bool, redisMode string) {
	normalized := normalizeOnlinePrefix(prefix, useHashTag, redisMode)
	if normalized == "" {
		OnlineKey = onlineKeyBase
		OnlineChannel = onlineChannelBase
		OnlineUserCountKey = onlineUserCountKeyBase
		OnlineUserCountHistoryKey = onlineUserCountHistoryKeyBase
		return
	}
	OnlineKey = normalized + onlineKeyBase
	OnlineChannel = normalized + onlineChannelBase
	OnlineUserCountKey = normalized + onlineUserCountKeyBase
	OnlineUserCountHistoryKey = normalized + onlineUserCountHistoryKeyBase
}

func normalizeOnlinePrefix(prefix string, useHashTag bool, redisMode string) string {
	prefix = strings.TrimSpace(prefix)
	if prefix == "" {
		return ""
	}
	prefix = strings.TrimSuffix(prefix, ":")
	if useHashTag || strings.EqualFold(redisMode, "cluster") {
		if !(strings.HasPrefix(prefix, "{") && strings.HasSuffix(prefix, "}")) {
			prefix = "{" + prefix + "}"
		}
	}
	return prefix + ":"
}

func GetOnlineKey(userID string) string {
	return OnlineKey + userID
}

func GetOnlineKeyUserID(key string) string {
	return strings.TrimPrefix(key, OnlineKey)
}
