package org.lingniu.idp.utils;

import com.alibaba.fastjson2.JSON;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import java.util.Base64;
import java.util.Map;
import java.util.UUID;

/**
 * Client凭证生成和验证工具
 */
public class ClientCredentialUtil {
    
    private static final PasswordEncoder PASSWORD_ENCODER = new BCryptPasswordEncoder();
    
    /**
     * 生成随机Client Secret（Base64编码）
     * @param length 字节长度，推荐32字节（256位）
     * @return 随机生成的Client Secret
     */
    public static String generateRandomSecret(int length) {
        byte[] randomBytes = new byte[length];
        new java.security.SecureRandom().nextBytes(randomBytes);
        return Base64.getUrlEncoder().withoutPadding().encodeToString(randomBytes);
    }
    
    /**
     * 使用BCrypt加密Client Secret
     * @param rawSecret 原始明文Secret
     * @return BCrypt加密后的Secret
     */
    public static String encodeWithBCrypt(String rawSecret) {
        return PASSWORD_ENCODER.encode(rawSecret);
    }
    
    /**
     * 生成Spring Security格式的加密Secret
     * @param rawSecret 原始明文Secret
     * @return {bcrypt}加密格式
     */
    public static String encodeWithBCryptPrefix(String rawSecret) {
        return "{bcrypt}" + PASSWORD_ENCODER.encode(rawSecret);
    }
    
    /**
     * 验证Client Secret
     * @param rawSecret 原始明文Secret
     * @param encodedSecret 已加密的Secret（可带或不带前缀）
     * @return 验证结果
     */
    public static boolean verifySecret(String rawSecret, String encodedSecret) {
        // 移除前缀（如果有）
        if (encodedSecret.startsWith("{bcrypt}")) {
            encodedSecret = encodedSecret.substring(8);
        } else if (encodedSecret.startsWith("{noop}")) {
            // 如果是明文存储
            return rawSecret.equals(encodedSecret.substring(6));
        }
        return PASSWORD_ENCODER.matches(rawSecret, encodedSecret);
    }
    
    /**
     * 生成Client ID（UUID格式）
     * @return 生成的Client ID
     */
    public static String generateClientId() {
        return UUID.randomUUID().toString().replace("-", "").substring(0, 24);
    }
    
    /**
     * 生成完整的Client凭证
     * @return 包含Client ID、原始Secret和加密Secret的Map
     */
    public static java.util.Map<String, String> generateClientCredentials() {
        String clientId = generateClientId();
        String rawSecret = generateRandomSecret(32);
        String encodedSecret = encodeWithBCryptPrefix(rawSecret);
        
        java.util.Map<String, String> credentials = new java.util.HashMap<>();
        credentials.put("clientId", clientId);
        credentials.put("rawSecret", rawSecret);
        credentials.put("encodedSecret", encodedSecret);
        
        return credentials;
    }

    public static void main(String[] args) {
        Map<String, String> stringStringMap = generateClientCredentials();
        System.out.println(JSON.toJSONString(stringStringMap));
    }
}