/**
 * @param prefix {string} - Define el componente al que se le agregará la clase
 * @param modifiers {[string]} - Array de modificadores a convertir en clases
 * @returns {string} - Retorna los modificadores convertidos en clase de componente
 */
export function modifiersToClass(prefix, modifers) {
  let propsToClass = [prefix];
  modifers.forEach(modifier => {
    if (typeof modifier == 'string') {
      propsToClass.push(`${prefix}--${modifier}`);
    }
    else if (typeof modifier == 'object') {
      if (Object.values(modifier)[0] === true) {
        propsToClass.push(`${prefix}--${Object.keys(modifier)[0]}`);
      }
    }
  });
  return propsToClass.join(' ');
}
/** Serie de expresiones regulares para validar el tipo de entrada de un campo de texto */
export const regexValidators = {
  empty: /(?!^$|\s+)/,
  dni: /^[0-9]{8}$/,
  document: /^[A-Za-z0-9]{1,16}$/,
  email: /^[-\w.%+]{1,64}@(?:[A-Z0-9-]{1,63}\.){1,125}[A-Z]{2,63}$/i,
  cvv: /[0-9]{3,4}/,
  number: /[0-9]+/,
  numberFormat: /[0-9\.\,]+/,
  expiration: /^(0[1-9]|1[0-2])\/([2-9][0-9])$/
};
/**
 * Convierte un texto con acentos y mayúsculas y lo convierte a texto plano
 * @param text {string} Recibe el texto con acentos, mayúsculas, etc
 */
export function convertToPlainString(text) {
  let plain = text.normalize('NFD').replace(/([^n\u0300-\u036f]|n(?!\u0303(?![\u0300-\u036f])))[\u0300-\u036f]+/gi, "$1").normalize();
  return plain.toLowerCase().trim();
}
/**
 * Retornará el siguiente elemento con el selector especificado, si no se especifica, retornará el siguiente inmediato.
 * @param element {HTMLElement} Elemento actual
 * @param selector {string} Selector a consultar
 */
export function nextSibling(element, selector) {
  let sibling = element.nextElementSibling;
  if (!selector) {
    return sibling;
  }
  while (sibling) {
    if (sibling.matches(selector)) {
      return sibling;
    }
    sibling = sibling.nextElementSibling;
  }
}
/**
 * Retornará el anterior elemento con el selector especificado, si no se especifica, retornará el anterior inmediato.
 * @param element {HTMLElement} Elemento actual
 * @param selector {string} Selector a consultar
 */
export function prevSibling(element, selector) {
  let sibling = element.previousElementSibling;
  if (!selector) {
    return sibling;
  }
  while (sibling) {
    if (sibling.matches(selector)) {
      return sibling;
    }
    sibling = sibling.previousElementSibling;
  }
}
/**
 * Retornará un arreglo con todos los elementos hermanos del elemento especificado
 * @param element {HTMLElement} Elemento actual
 * @param selector {string} Selector a consultar
 */
export function allSiblings(element, selector) {
  let siblings = [];
  if (!element.parentNode) {
    return siblings;
  }
  const allChilds = element.parentNode.childNodes;
  allChilds.forEach((child) => {
    if (child != element && !child.matches(selector)) {
      siblings.push(child);
    }
  });
  return siblings;
}
/**
 * Retornará true cuando el elemento se encuentre visible en pantalla, de lo contrario retornará false
 * @param element {HTMLElement} Elemento a verificar
 * @param container {HTMLElement} Contenedor del elemento a verificar
 */
export function visibilityValidate(element, container) {
  let visible = false;
  const containerTop = container.scrollTop;
  const containerBottom = containerTop + container.clientHeight;
  if (element != null) {
    const elemTop = element.offsetTop;
    const elemBottom = elemTop + element.clientHeight;
    visible = (containerBottom >= elemTop) && (elemBottom >= containerTop);
  }
  return visible;
}
/**
 * Retornará el mismo texto, con la primera letra en mayúscula
 * @param text {string} Texto en minúscula
 */
export function firstCapitalice(text) {
  return text.replace(text.charAt(0), text.charAt(0).toUpperCase());
}
/**
 * Retornará el número con formato
 * @param value {number} Número sin formato
 */
export function numberFormat(value) {
  const reverse = value.toString().split('').reverse();
  let arrays = [
    reverse.slice(0, 3),
    reverse.slice(3, 6),
    reverse.slice(6, 9),
    reverse.slice(9, 12)
  ];
  let str = '';
  arrays.forEach((a, i) => {
    if (a.length > 0) {
      str += (i > 0 ? ',' : '') + a.join('');
    }
  });
  return str.split('').reverse().join('');
}
