text: import throttle from 'lodash/throttle';
  import URI from 'url-parse';
  import qs from 'querystringify';
  import history from './history';
  
  export const DEFAULTS = {
      uri: '',
      limit: 20,
      snippet: 300,
      min: 3,
      search_type: 'auto',
      in_page: false,
      live_update: true,
  };
  
  const historyPush = ({ value = false, params = false } = {}) => {
      const uri = new URI(global.location.href, true);
  
      if (params === false) {
          delete uri.query.q;
      } else {
          uri.query.q = params;
      }
  
      const querystring = qs.stringify(uri.query, '?');
  
      history.push(`${uri.pathname}${querystring}`, {
          historyValue: value, type: 'tntsearch',
      });
  };
  
  const throttling = throttle(async ({ input, results, historyValue = false } = {}) => {
      if (!input || !results) { return false; }
  
      const value = historyValue || input.value.trim();
      const clear = input.nextElementSibling;
      const data = Object.assign({}, DEFAULTS, JSON.parse(input.dataset.tntsearch || '{}'));
  
      if (!value) {
          results.style.display = 'none';
  
          if (data.in_page) {
              clear.style.display = 'none';
  
              if (historyValue === false && data.live_update) {
                  historyPush({ value });
              }
          }
  
          return false;
      }
  
      if (value.length < data.min) {
          return false;
      }
  
      if (data.in_page) {
          clear.style.display = '';
      }
  
      const params = {
          q: value,
          l: data.limit,
          sl: data.snippet,
          search_type: data.search_type,
          ajax: true,
      };
  
      const startEvent = new Event('tntsearch:start');
      const query = Object.keys(params)
          .map(k => `${k}=${params[k]}`)
          .join('&');
  
      input.dispatchEvent(startEvent);
      fetch(`${data.uri}?${query}`)
          .then((response) => response.text())
          .then((response) => {
              if (data.in_page && data.live_update && !historyValue) {
                  historyPush({ value, params: params.q });
              }
              return response;
          })
          .then((response) => {
              const doneEvent = new Event('tntsearch:done');
              results.style.display = '';
              results.innerHTML = response;
              input.dispatchEvent(doneEvent);
  
              return response;
          });
  
      return this;
  }, 350, { leading: false });
  
  history.listen((location) => {
      if (location.state && location.state.type === 'tntsearch') {
          location.state.input = document.querySelector('.tntsearch-field-inpage');
          location.state.results = document.querySelector('.tntsearch-results-inpage');
  
          if (location.state.input && location.state.results) {
              location.state.input.value = location.state.historyValue;
              throttling({ ...location.state });
          }
      }
  });
  
  export default throttling;
  