const constants = require('../constants');
const logger = require('winston');
const ua = require('universal-analytics');
const config = require('../config/speechConfig.js');
const googleApiKey = config.analytics.googleId;
const db = require('../models');

module.exports = {
  createPublishTimingEventParams (publishDurration, ip, headers, label) {
    return {
      userTimingCategory    : 'lbrynet',
      userTimingVariableName: 'publish',
      userTimingTime        : publishDurration,
      userTimingLabel       : label,
      uip                   : ip,
      ua                    : headers['user-agent'],
      ul                    : headers['accept-language'],
    };
  },
  postToStats (action, url, ipAddress, name, claimId, result) {
    logger.debug('action:', action);
    // make sure the result is a string
    if (result && (typeof result !== 'string')) {
      result = result.toString();
    }
    // make sure the ip address(es) are a string
    if (ipAddress && (typeof ipAddress !== 'string')) {
      ipAddress = ipAddress.toString();
    }
    db.File
      .findOne({where: { name, claimId }})
      .then(file => {
        // create record in the db
        let FileId;
        if (file) {
          FileId = file.dataValues.id;
        } else {
          FileId = null;
        }
        return db.Request
          .create({
            action,
            url,
            ipAddress,
            result,
            FileId,
          });
      })
      .catch(error => {
        logger.error('Sequelize error >>', error);
      });
  },
  sendGoogleAnalyticsEvent (action, headers, ip, originalUrl) {
    const visitorId = ip.replace(/\./g, '-');
    const visitor = ua(googleApiKey, visitorId, { strictCidFormat: false, https: true });
    let params;
    switch (action) {
      case 'SERVE':
        params = {
          ec : 'serve',
          ea : originalUrl,
          uip: ip,
          ua : headers['user-agent'],
          ul : headers['accept-language'],
        };
        break;
      default: break;
    }
    visitor.event(params, (err) => {
      if (err) {
        logger.error('Google Analytics Event Error >>', err);
      }
    });
  },
  sendGoogleAnalyticsTiming (action, headers, ip, originalUrl, startTime, endTime) {
    const visitorId = ip.replace(/\./g, '-');
    const visitor = ua(googleApiKey, visitorId, { strictCidFormat: false, https: true });
    const durration = endTime - startTime;
    let params;
    switch (action) {
      case constants.PUBLISH_ANONYMOUS_CLAIM:
      case constants.PUBLISH_IN_CHANNEL_CLAIM:
        logger.verbose(`${action} completed successfully in ${durration}ms`);
        params = module.exports.createPublishTimingEventParams(durration, ip, headers, action);
        break;
      default: break;
    }
    visitor.timing(params, (err) => {
      if (err) {
        logger.error('Google Analytics Event Error >>', err);
      }
      logger.debug(`${action} timing event successfully sent to google analytics`);
    });
  },
};