import { formatObjKey } from './formatObjKey';

function type(params) {
  return Object.prototype.toString
    .call(params)
    .replace(/(.*? |])/g, '')
    .toLowerCase();
}

export function obj2xml(obj, options?) {
  let s = '';
  if (options && options.headers) {
    s = '<?xml version="1.0" encoding="UTF-8"?>\n';
  }
  if (options && options.firstUpperCase) {
    obj = formatObjKey(obj, 'firstUpperCase');
  }
  if (type(obj) === 'object') {
    Object.keys(obj).forEach(key => {
      // filter undefined or null
      if (type(obj[key]) !== 'undefined' && type(obj[key]) !== 'null') {
        if (type(obj[key]) === 'string' || type(obj[key]) === 'number') {
          s += `<${key}>${obj[key]}</${key}>`;
        } else if (type(obj[key]) === 'object') {
          s += `<${key}>${obj2xml(obj[key])}</${key}>`;
        } else if (type(obj[key]) === 'array') {
          s += obj[key].map(keyChild => `<${key}>${obj2xml(keyChild)}</${key}>`).join('');
        } else {
          s += `<${key}>${obj[key].toString()}</${key}>`;
        }
      }
    });
  } else {
    s += obj.toString();
  }
  return s;
}
