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

import java.util.concurrent.ThreadLocalRandom;

/**
 * Clase utilitaria para operaciones relacionadas con solicitudes HTTP y
 * generación de identificadores. Proporciona métodos para generar IDs únicos,
 * obtener información del cliente y gestionar información del dispositivo.
 */
public class RequestHelper {

    private final String ALPHANUMERIC_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    private final int baseCharacterLen = ALPHANUMERIC_CHARACTERS.length();


    /**
     * Permite tener una cadena aleatoria de caracteres numericos
     *
     * @param len longitud de la cadena numerica a retornar
     * @return
     */
    public String randomNumeric(int len) {
        char[] chars = new char[len];
        for (int i = 0; i < len; i++) {
            chars[i] = (char) ThreadLocalRandom.current().nextInt(48, 58); // ascii  index number
        }

        return new String(chars);
    }

    /**
     * Permite tener una cadena aleatoria de caracteres alfa-numericos
     *
     * @param len longitud de la cadena alfa-numerica a retornar
     * @return
     */
    public String randomAlphanumeric(int len) {
        char[] chars = new char[len];
        for (int i = 0; i < len; i++) {
            chars[i] = ALPHANUMERIC_CHARACTERS.charAt(ThreadLocalRandom.current().nextInt(baseCharacterLen));
        }

        return new String(chars);
    }


    /**
     * Retorna Identificador de la Instancia del Request, usando como prefijo un valor predefinido
     * ejemplos: P2P, REM,
     * Facilita identificar el origen de los Requests
     * Deberia obtenerse una vez al inicia el Request
     *
     * @param apiSourceId
     * @return
     */
    public String getInstanceId(String apiSourceId) {
        return (apiSourceId == null ? "INST" : apiSourceId).concat(randomAlphanumeric(10));
    }

    /**
     * Retorna un Identificador del Request, se sugiere usar el getInstanceId creada como prefijo.
     * Usar uno para Cada Request que implique afectacion financiera
     *
     * @param instanceId
     * @return
     */
    public String getRequestId(String instanceId) {
        return instanceId.concat("REQ").concat(randomAlphanumeric(20));
    }


    /**
     * Permite Obtener un valor Numerico de Identificador de Transaccion
     *
     * @param len
     * @return
     */
    public String getTransactionId(int len) {
        return randomNumeric(len);
    }
}
