const updateQueryParams = (key, value, url) => {

if (!url) url = window.location.href;
let re = new RegExp(`([?&])${key}=.*?(&|#|$)(.*)`, "gi"), hash;

if (re.test(url)) {
    if (typeof value !== 'undefined' && value !== null)
        return url.replace(re, `$1${key}=${value}$2$3`);
    else {
        hash = url.split('#');
        url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
        if (typeof hash[1] !== 'undefined' && hash[1] !== null)
            url += `#${hash[1]}`;
        return url;
    }
}
else {
    if (typeof value !== 'undefined' && value !== null) {
        const separator = url.indexOf('?') !== -1 ? '&' : '?';
        hash = url.split('#');
        url = `${hash[0]}${separator}${key}=${value}`;
        if (typeof hash[1] !== 'undefined' && hash[1] !== null)
            url += `#${hash[1]}`;
        return url;
    }
    else
        return url;
}

};

const getQueryParam = (name, url) => {

if (!url) url = window.location.href;
name = name.replace(/[\[\]]/g, '\\$&');
const regex = new RegExp(`[?&]${name}(=([^&#]*)|&|#|$)`), results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, ' '));

};

const queryParamsToObject = () => {

const search = window.location.search.substring(1);
if(search.length === 0){
  return {}
} else {
  const result = JSON.parse(
    `{"${search.replace(/&/g, '","').replace(/=/g,'":"')}"}`,
    (key, value) => { return key===""?value:decodeURIComponent(value) }
  );
  return result;
}

};

export default {

updateQueryParams: updateQueryParams,
getQueryParam: getQueryParam,
queryParamsToObject: queryParamsToObject

}