package com.social.media.domain.user.valueobject;

/**
 * Value Object representing a CPF (Brazilian personal document)
 */
public record Cpf(String value) {
    
    public Cpf {
        if (value == null || value.trim().isEmpty()) {
            throw new IllegalArgumentException("CPF cannot be null or empty");
        }
        
        String cleanedValue = value.replaceAll("[^0-9]", "");
        
        if (!isValidCpf(cleanedValue)) {
            throw new IllegalArgumentException("Invalid CPF: " + value);
        }
        
        value = cleanedValue;
    }
    
    public String getFormattedValue() {
        if (value.length() == 11) {
            return String.format("%s.%s.%s-%s", 
                value.substring(0, 3), 
                value.substring(3, 6), 
                value.substring(6, 9), 
                value.substring(9));
        }
        return value;
    }
    
    private static boolean isValidCpf(String cpf) {
        if (cpf.length() != 11) {
            return false;
        }
        
        // Check if all digits are the same
        if (cpf.matches("(\\d)\\1{10}")) {
            return false;
        }
        
        // Validate check digits
        try {
            int[] digits = cpf.chars().map(c -> c - '0').toArray();
            
            // First check digit
            int sum = 0;
            for (int i = 0; i < 9; i++) {
                sum += digits[i] * (10 - i);
            }
            int firstCheck = 11 - (sum % 11);
            if (firstCheck >= 10) firstCheck = 0;
            
            if (digits[9] != firstCheck) {
                return false;
            }
            
            // Second check digit
            sum = 0;
            for (int i = 0; i < 10; i++) {
                sum += digits[i] * (11 - i);
            }
            int secondCheck = 11 - (sum % 11);
            if (secondCheck >= 10) secondCheck = 0;
            
            return digits[10] == secondCheck;
            
        } catch (Exception e) {
            return false;
        }
    }
    
    @Override
    public String toString() {
        return getFormattedValue();
    }
}
