package com.social.media.domain.company.valueobject;

import com.social.media.domain.shared.exception.DomainException;

import java.util.regex.Pattern;

/**
 * Value Object representing a CNPJ (Brazilian company tax ID)
 */
public record Cnpj(String value) {
    
    private static final Pattern CNPJ_PATTERN = Pattern.compile("^\\d{2}\\.\\d{3}\\.\\d{3}/\\d{4}-\\d{2}$");
    private static final Pattern DIGITS_ONLY = Pattern.compile("\\D");
    
    public Cnpj {
        if (value != null && !value.trim().isEmpty()) {
            String cleanValue = value.trim();
            if (!isValid(cleanValue)) {
                throw new InvalidCnpjException("Invalid CNPJ format: " + value);
            }
            value = cleanValue;
        }
    }
    
    public static Cnpj of(String value) {
        return new Cnpj(value);
    }
    
    public String getDigitsOnly() {
        if (value == null) return null;
        return DIGITS_ONLY.matcher(value).replaceAll("");
    }
    
    private static boolean isValid(String cnpj) {
        if (cnpj == null || cnpj.trim().isEmpty()) {
            return true; // CNPJ is optional
        }
        
        // Check format
        if (!CNPJ_PATTERN.matcher(cnpj).matches()) {
            return false;
        }
        
        // Basic validation - could be enhanced with checksum validation
        String digits = DIGITS_ONLY.matcher(cnpj).replaceAll("");
        return digits.length() == 14;
    }
    
    @Override
    public String toString() {
        return value;
    }
    
    public static class InvalidCnpjException extends DomainException {
        public InvalidCnpjException(String message) {
            super(message);
        }
    }
}
