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

/**
 * Clase utilitaria para la generación de mensajes de registro (logging).
 * Facilita la creación de cadenas formateadas para registrar información de
 * solicitudes y respuestas, tanto públicas como privadas, así como mensajes de
 * error. Utiliza un formato estandarizado para mejorar la legibilidad y
 * facilitar el análisis de los registros del sistema.
 */
public class LoggerHelper {

    /**
     * Construye una cadena de información para una solicitud pública.
     *
     * @param requestId El ID de la solicitud.
     * @param request   El objeto de solicitud.
     * @param <T>       El tipo del objeto de solicitud.
     * @return Una cadena de información formateada.
     */
    public static <T> String buildInfoRequest(String requestId, T request) {
        return String.format("[PUB RQ: %s] [%s]", requestId, JsonHelper.getJsonFromObject(request));
    }

    /**
     * Construye una cadena de información para una solicitud pública.
     *
     * @param requestId El ID de la solicitud.
     * @param request   El request en cadena de la solicitud.
     * @return Una cadena de información formateada.
     */
    public static <T> String buildInfoRequest(String requestId, String request) {
        return String.format("[PUB RQ: %s] [%s]", requestId, request);
    }

    /**
     * Construye una cadena de información para una respuesta pública.
     *
     * @param requestId El ID de la solicitud.
     * @param response  El objeto de respuesta.
     * @param <T>       El tipo del objeto de respuesta.
     * @return Una cadena de información formateada.
     */
    public static <T> String buildInfoResponse(String requestId, T response) {
        return String.format("[PUB RS: %s] [%s]", requestId, JsonHelper.getJsonFromObject(response));
    }

    /**
     * Construye una cadena de información para una respuesta pública.
     *
     * @param requestId El ID de la solicitud.
     * @param response  El objeto en cadena de respuesta.
     * @return Una cadena de información formateada.
     */
    public static String buildInfoResponse(String requestId, String response) {
        return String.format("[PUB RS: %s] [%s]", requestId, response);
    }

    /**
     * Construye una cadena de información para una solicitud privada.
     *
     * @param requestId El ID de la solicitud.
     * @param name      El nombre de la solicitud privada.
     * @param request   El objeto de solicitud.
     * @param <T>       El tipo del objeto de solicitud.
     * @return Una cadena de información formateada.
     */
    public static <T> String buildInfoPrivateRequest(String requestId, String name, T request) {
        return String.format("[PRV RQ %s: %s] [%s]", name, requestId, JsonHelper.getJsonFromObject(request));
    }

    /**
     * Construye una cadena de información para una solicitud privada.
     *
     * @param requestId El ID de la solicitud.
     * @param name      El nombre de la solicitud privada.
     * @param request   El objeto en cadena de la solicitud.
     * @return Una cadena de información formateada.
     */
    public static String buildInfoPrivateRequest(String requestId, String name, String request) {
        return String.format("[PRV RQ %s: %s] [%s]", name, requestId, request);
    }

    /**
     * Construye una cadena de información para una respuesta privada.
     *
     * @param requestId El ID de la solicitud.
     * @param name      El nombre de la respuesta privada.
     * @param response  El objeto de respuesta.
     * @param <T>       El tipo del objeto de respuesta.
     * @return Una cadena de información formateada.
     */
    public static <T> String buildInfoPrivateResponse(String requestId, String name, T response) {
        return String.format("[PRV RS %s: %s] [%s]", name, requestId, JsonHelper.getJsonFromObject(response));
    }

    /**
     * Construye una cadena de información para una respuesta privada.
     *
     * @param requestId El ID de la solicitud.
     * @param name      El nombre de la respuesta privada.
     * @param response  El objeto en cadena de la respuesta.
     * @return Una cadena de información formateada.
     */
    public static String buildInfoPrivateResponse(String requestId, String name, String response) {
        return String.format("[PRV RS %s: %s] [%s]", name, requestId, response);
    }

    /**
     * Construye una cadena de error.
     *
     * @param requestId El ID de la solicitud asociada al error.
     * @param out       El mensaje de error.
     * @return Una cadena de error formateada.
     */
    public static String buildError(String requestId, String out) {
        return String.format("[ERROR %s] [%s]", requestId, out);
    }
}
