package sd.serialization;

/**
 * Fábrica estática (Factory Pattern) para instanciação controlada de {@link MessageSerializer}.
 * <p>
 * Esta classe centraliza a criação de estratégias de serialização, garantindo consistência
 * de configuração em todo o sistema distribuído. Permite a injeção de configurações via
 * Propriedades de Sistema (System Properties), facilitando a alternância entre modos de
 * depuração (Pretty Print) e produção (Compacto) sem recompilação.
 * <p>
 * <b>Exemplo de Uso:</b>
 * <pre>
 * MessageSerializer serializer = SerializerFactory.createDefault();
 * byte[] data = serializer.serialize(myObject);
 * </pre>
 */
public class SerializerFactory {
    
    /**
     * Chave da propriedade de sistema para ativar a formatação JSON legível (Pretty Print).
     * Defina {@code -Dsd.serialization.json.prettyPrint=true} na JVM para ativar.
     */
    public static final String JSON_PRETTY_PRINT_PROPERTY = "sd.serialization.json.prettyPrint";
    
    // Default configuration (Production-ready)
    private static final boolean DEFAULT_JSON_PRETTY_PRINT = false;
    
    /**
     * Construtor privado para prevenir instanciação acidental desta classe utilitária.
     */
    private SerializerFactory() {
        throw new UnsupportedOperationException("Factory class cannot be instantiated");
    }
    
    /**
     * Cria um serializador JSON configurado dinamicamente pelo ambiente.
     * <p>
     * Verifica a propriedade de sistema {@value #JSON_PRETTY_PRINT_PROPERTY}.
     * Se não definida, assume o padrão de produção (falso/compacto).
     * * @return Uma instância configurada de {@link JsonMessageSerializer}.
     */
    public static MessageSerializer createDefault() {
        boolean prettyPrint = Boolean.getBoolean(JSON_PRETTY_PRINT_PROPERTY);
        return new JsonMessageSerializer(prettyPrint);
    }
    
    /**
     * Cria um serializador JSON com configuração padrão otimizada (sem indentação).
     * Ideal para ambientes de produção onde a largura de banda é prioritária.
     * * @return Uma instância compacta de {@link JsonMessageSerializer}.
     */
    public static MessageSerializer createSerializer() {
        return createSerializer(DEFAULT_JSON_PRETTY_PRINT);
    }
    
    /**
     * Cria um serializador JSON com configuração explícita de formatação.
     * * @param prettyPrint {@code true} para ativar indentação (Debug), {@code false} para compacto.
     * @return Uma instância personalizada de {@link JsonMessageSerializer}.
     */
    public static MessageSerializer createSerializer(boolean prettyPrint) {
        return new JsonMessageSerializer(prettyPrint);
    }
}