package com.red.circle.other.app.util;

import java.security.SecureRandom;

public class Base36InviteCodeGenerator {

    private static final String CHAR_SET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 36字符
    private static final int CODE_LENGTH = 8; // 固定8位
    private static final SecureRandom RANDOM = new SecureRandom();

    /**
     * 将用户ID编码为8位随机邀请码（Base36）
     * 使用用户ID作为随机种子，确保同一ID生成相同邀请码
     */
    public static String encode(long userId) {
        if (userId < 0) {
            throw new IllegalArgumentException("用户ID不能为负数: " + userId);
        }

        // 使用用户ID作为种子初始化随机数生成器，确保同一ID生成相同邀请码
        SecureRandom random = new SecureRandom();
        random.setSeed(userId);
        
        StringBuilder sb = new StringBuilder(CODE_LENGTH);
        
        // 第一位不使用0，避免看起来像前导零
        sb.append(CHAR_SET.charAt(1 + random.nextInt(35))); // 1-35，即 1-Z
        
        // 后续7位随机生成
        for (int i = 1; i < CODE_LENGTH; i++) {
            sb.append(CHAR_SET.charAt(random.nextInt(36))); // 0-35，即 0-Z
        }
        
        return sb.toString();
    }

    /**
     * 生成完全随机的8位邀请码（不基于用户ID）
     */
    public static String generateRandom() {
        StringBuilder sb = new StringBuilder(CODE_LENGTH);
        
        // 第一位不使用0
        sb.append(CHAR_SET.charAt(1 + RANDOM.nextInt(35))); // 1-Z
        
        // 后续7位随机生成
        for (int i = 1; i < CODE_LENGTH; i++) {
            sb.append(CHAR_SET.charAt(RANDOM.nextInt(36))); // 0-Z
        }
        
        return sb.toString();
    }

    // 测试
    public static void main(String[] args) {
        System.out.println("=== 基于用户ID的邀请码生成（同一ID生成相同邀请码）===");
        long[] testIds = {1L, 100L, 8826602L, 1000000L, 99999999L};
        
        for (long userId : testIds) {
            String code1 = encode(userId);
            String code2 = encode(userId); // 再次生成，验证是否相同
            System.out.println("ID: " + userId + " -> 邀请码: " + code1 + " (再次生成: " + code2 + ", 相同: " + code1.equals(code2) + ")");
        }
        
        System.out.println("\n=== 特定ID测试 ===");
        long userId = 8826602L;
        String code = encode(userId);
        System.out.println("ID " + userId + " -> 邀请码: " + code);
        System.out.println("无前导零: " + !code.startsWith("0"));
        System.out.println("长度: " + code.length());
        
        System.out.println("\n=== 完全随机邀请码生成 ===");
        for (int i = 0; i < 5; i++) {
            System.out.println("随机邀请码 " + (i + 1) + ": " + generateRandom());
        }
    }
}
