package com.qqchen.deploy.backend.framework.utils;

import java.util.UUID;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 会话ID生成器（Framework层）
 * 
 * 线程安全的SessionId生成，避免并发场景下的ID冲突
 * 使用策略：UUID + 时间戳 + 递增序列号
 */
public class SessionIdGenerator {
    
    /**
     * 重入锁，保证并发安全
     */
    private static final Lock lock = new ReentrantLock();
    
    /**
     * 递增序列号（用于同一毫秒内的并发请求）
     */
    private static final AtomicLong sequence = new AtomicLong(0);
    
    /**
     * 上次生成ID的时间戳
     */
    private static volatile long lastTimestamp = -1L;
    
    /**
     * 生成唯一的SessionId
     * 
     * 格式：{UUID}-{timestamp}-{sequence}
     * 例如：f47ac10b-58cc-4372-a567-0e02b2c3d479-1733475005408-001
     * 
     * @return 唯一的SessionId
     */
    public static String generateSessionId() {
        lock.lock();
        try {
            long timestamp = System.currentTimeMillis();
            
            // 如果时间戳相同，递增序列号
            if (timestamp == lastTimestamp) {
                sequence.incrementAndGet();
            } else {
                // 新的毫秒，重置序列号
                sequence.set(0);
                lastTimestamp = timestamp;
            }
            
            // 生成UUID（去掉连字符，缩短长度）
            String uuid = UUID.randomUUID().toString().replace("-", "");
            
            // 组合：UUID + 时间戳 + 序列号（3位补零）
            return String.format("%s-%d-%03d", uuid, timestamp, sequence.get());
            
        } finally {
            lock.unlock();
        }
    }
    
    /**
     * 生成短格式SessionId（更紧凑）
     * 
     * 格式：{timestamp}{sequence}{randomSuffix}
     * 例如：1733475005408001A3F9
     * 
     * @return 短格式唯一SessionId
     */
    public static String generateShortSessionId() {
        lock.lock();
        try {
            long timestamp = System.currentTimeMillis();
            
            if (timestamp == lastTimestamp) {
                sequence.incrementAndGet();
            } else {
                sequence.set(0);
                lastTimestamp = timestamp;
            }
            
            // 生成4位随机后缀
            String randomSuffix = UUID.randomUUID().toString().substring(0, 4).toUpperCase();
            
            // 组合：时间戳 + 序列号（3位） + 随机后缀
            return String.format("%d%03d%s", timestamp, sequence.get(), randomSuffix);
            
        } finally {
            lock.unlock();
        }
    }
    
    /**
     * 从WebSocket Session中生成增强的SessionId
     * 
     * 在原始WebSocket SessionId基础上添加时间戳和序列号，确保绝对唯一
     * 
     * @param webSocketSessionId WebSocket原始SessionId
     * @return 增强的SessionId
     */
    public static String enhanceWebSocketSessionId(String webSocketSessionId) {
        if (webSocketSessionId == null || webSocketSessionId.isEmpty()) {
            return generateSessionId();
        }
        
        lock.lock();
        try {
            long timestamp = System.currentTimeMillis();
            
            if (timestamp == lastTimestamp) {
                sequence.incrementAndGet();
            } else {
                sequence.set(0);
                lastTimestamp = timestamp;
            }
            
            // WebSocket SessionId + 时间戳 + 序列号
            return String.format("%s-%d-%03d", webSocketSessionId, timestamp, sequence.get());
            
        } finally {
            lock.unlock();
        }
    }
}
