package com.banesco.common.domain.dto.bian.device;

/**
 * Clase utilitaria para operaciones con cadenas de texto (strings). Proporciona
 * métodos para validar, manipular y formatear cadenas de texto. Incluye
 * funcionalidades como verificación de tipos numéricos, validación de cadenas
 * no vacías y funciones de formato como relleno de caracteres.
 */
public class StringHelper {

    /**
     * Verifica si una cadena de texto representa un número entero.
     *
     * @param value La cadena de texto a verificar.
     * @return true si la cadena es un número entero válido, false en caso
     * contrario.
     * @throws NumberFormatException Si el string no tiene el formato adeacuado
     */
    public static boolean isNumeric(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }
        try {
            Integer.parseInt(value);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    /**
     * Verifica si una cadena de texto es nula o está vacía después de
     * eliminar espacios en blanco.
     *
     * @param value La cadena de texto a verificar.
     * @return true si la cadena está vacía, false en caso contrario.
     */
    public static boolean isEmpty(String value) {
        return value == null || value.trim().isEmpty();
    }


    /**
     * Rellena una cadena de texto con un carácter específico a la izquierda
     * hasta alcanzar la longitud deseada.
     *
     * @param inputStr  La cadena de texto a rellenar.
     * @param strLenOut La longitud deseada de la cadena resultante.
     * @param padChar   El carácter de relleno.
     * @return La cadena rellenada con el carácter especificado a la izquierda.
     */
    public static String leftPad(String inputStr, int strLenOut, char padChar) {
        if (inputStr == null) {
            inputStr = ""; // Handle null input
        }
        int padLength = strLenOut - inputStr.length();
        if (padLength <= 0) {
            return inputStr; // No padding needed
        }

        char[] paddedString = new char[padLength];
        for (int i = 0; i < padLength; i++) {
            paddedString[i] = padChar;
        }

        return new String(paddedString).concat(inputStr);
    }

    /**
     * Permite convertir nombre de propiedad separada con (,-) to CamelCase
     *
     * @param inputStr   Cadena de texto a convertir
     * @param firstUpper Flag que indica si la primera letra es Mayuscula
     * @return
     */
    public static String convertToCamelCase(String inputStr, boolean firstUpper) {

        StringBuilder result = new StringBuilder();
        boolean capitalizeNext = firstUpper;

        for (char ch : inputStr.toCharArray()) {
            if (ch == '.' || ch == '-') {
                capitalizeNext = true; // Next character should be capitalized
            } else {
                if (capitalizeNext) {
                    result.append(Character.toUpperCase(ch)); // Capitalize current character
                    capitalizeNext = false; // Reset flag
                } else {
                    result.append(Character.toLowerCase(ch)); // Append in lowercase
                }
            }
        }

        return result.toString();

    }

    /**
     * @param inputStr Cadena de texto a convertir en UpperCamelCase
     * @return
     */
    public static String convertToUpperCamelCase(String inputStr) {
        return convertToCamelCase(inputStr, true);
    }

}
