import _ from 'lodash';
import { decodeFcc } from '../../../../utils/encode-decode';

const queryRegex = /^(\?|#\?)/;
export function legacyIsInQuery(query, decode) {
  let decoded;
  try {
    decoded = decode(query);
  } catch (err) {
    return false;
  }
  if (!decoded || typeof decoded.split !== 'function') {
    return false;
  }
  return decoded
    .replace(queryRegex, '')
    .split('&')
    .reduce(function(found, param) {
      var key = param.split('=')[0];
      if (key === 'solution') {
        return true;
      }
      return found;
    }, false);
}

export function getKeyInQuery(query, keyToFind = '') {
  return query
    .split('&')
    .reduce((oldValue, param) => {
      const key = param.split('=')[0];
      const value = param
        .split('=')
        .slice(1)
        .join('=');

      if (key === keyToFind) {
        return value;
      }
      return oldValue;
    }, null);
}

export function getLegacySolutionFromQuery(query = '', decode) {
  return _.flow(
    getKeyInQuery,
    decode,
    decodeFcc
  )(query, 'solution');
}

export function getCodeUri(location, decodeURIComponent) {
  let query;
  if (
    location.search &&
    legacyIsInQuery(location.search, decodeURIComponent)
  ) {
    query = location.search.replace(/^\?/, '');
  } else {
    return null;
  }

  return getLegacySolutionFromQuery(query, decodeURIComponent);
}

export function removeCodeUri(location, history) {
  if (
    typeof location.href.split !== 'function' ||
    typeof history.replaceState !== 'function'
  ) {
    return false;
  }
  history.replaceState(
    history.state,
    null,
    location.href.split('?')[0]
  );
  return true;
}
