import { isNil } from 'lodash';

export function validateCatastro(value: string) {
  const regex = /^[A-Za-z0-9]{20}$/;
  return regex.test(value);
}

export function validateSerializedJson(stringObj?: string) {
  if (typeof stringObj !== 'string') return false;
  try {
    // stringObj = stringObj.replace(/'/g, '"');
    JSON.parse(stringObj);
  } catch (err: any) {
    console.log(err);
    return false;
  }
  return true;
}

export function validateSerializedFn(stringFn: string, returnType?: 'string' | 'number' | 'boolean' | 'object', ...args: any[]) {
  if (typeof stringFn !== 'string') return false;
  let valid = true;
  let value: any;
  const _stringFn = stringFn.replace(/\$(?!\{)[^ ]+?[ ;,]/g, 'null ');
  try {
    const fn = eval(_stringFn);
    value = fn.apply(null, args);
  } catch (err: any) {
    console.log(err);
    // TODO: revisar bien esto: si salta un error skippeable deberia seguir tratando de evaluar la funcion
    const skippableMessages = ['is not a function', 'is not defined', 'not read properties of undefined', 'Invalid or unexpected token'];
    if (skippableMessages.some((m) => err?.message.includes(m))) {
      valid = true;
    } else {
      valid = false;
    }
  }
  if (!valid) return false;
  return isNil(returnType) ? true : typeof value === returnType;
}

export function isJson(str?: any) {
  if (typeof str !== 'string') return false;
  try {
    JSON.parse(str);
    return true;
  } catch (err) {
    return false;
  }
}
