const logger = require('winston');
const ua = require('universal-analytics');
const { analytics : { googleId }, details: { title } } = require('@config/siteConfig');

const createServeEventParams = (headers, ip, originalUrl) => {
  return {
    eventCategory    : 'client requests',
    eventAction      : 'serve request',
    eventLabel       : originalUrl,
    ipOverride       : ip,
    userAgentOverride: headers['user-agent'],
    documentReferrer : headers['referer'],
  };
};

const createTimingEventParams = (category, variable, label, startTime, endTime) => {
  const duration = endTime - startTime;
  return {
    userTimingCategory    : category,
    userTimingVariableName: variable,
    userTimingTime        : duration,
    userTimingLabel       : label,
  };
};

const sendGoogleAnalyticsEvent = (ip, params) => {
  if (!googleId) {
    return logger.debug('Skipping analytics event because no GoogleId present in configs');
  }
  const visitorId = ip.replace(/\./g, '-');
  const visitor = ua(googleId, visitorId, { strictCidFormat: false, https: true });
  visitor.event(params, (err) => {
    if (err) {
      return logger.error('Google Analytics Event Error >>', err);
    }
    logger.debug(`Event successfully sent to google analytics`, params);
  });
};

const sendGoogleAnalyticsTiming = (siteTitle, params) => {
  if (!googleId) {
    return logger.debug('Skipping analytics timing because no GoogleId present in configs');
  }
  const visitor = ua(googleId, siteTitle, { strictCidFormat: false, https: true });
  visitor.timing(params, (err) => {
    if (err) {
      return logger.error('Google Analytics Event Error >>', err);
    }
    logger.debug(`Event successfully sent to google analytics`, params);
  });
};

const sendGAServeEvent = (headers, ip, originalUrl) => {
  const params = createServeEventParams(headers, ip, originalUrl);
  sendGoogleAnalyticsEvent(ip, params);
};

const sendGATimingEvent = (category, variable, label, startTime, endTime) => {
  const params = createTimingEventParams(category, variable, label, startTime, endTime);
  sendGoogleAnalyticsTiming(title, params);
};

const chooseGaLbrynetPublishLabel = ({ channel_name: channelName, channel_id: channelId }) => {
  return (channelName || channelId ? 'PUBLISH_IN_CHANNEL_CLAIM' : 'PUBLISH_ANONYMOUS_CLAIM');
};

module.exports = {
  sendGAServeEvent,
  sendGATimingEvent,
  chooseGaLbrynetPublishLabel,
};