import { Observable } from 'rx';
import { createErrorObservable } from '../../common/app/redux';
import capitalize from 'lodash/capitalize';

// analytics types
// interface social {
//   network: String, // facebook, twitter, etc
//   action: String, // like, favorite, etc
//   target: String // url like fcc.com or any other string
// }
// interface event {
//   category: String,
//   action: String,
//   label?: String,
//   value?: String
// }
//
const types = [ 'event', 'social' ];
function formatFields({ type, ...fields }) {
  // make sure type is supported
  if (!types.some(_type => _type === type)) {
    return null;
  }
  return Object.keys(fields).reduce((_fields, field) => {
    _fields[ type + capitalize(field) ] = fields[ field ];
    return _fields;
  }, { type });
}

export default function analyticsSaga(actions, _, { window }) {
  const { ga } = window;
  if (typeof ga !== 'function') {
    console.log('GA not found');
    return Observable.empty();
  }
  return actions
    .filter(({ meta }) => !!(meta && meta.analytics && meta.analytics.type))
    .map(({ meta: { analytics } }) => formatFields(analytics))
    .filter(Boolean)
    // ga always returns undefined
    .map(({ type, ...fields }) => ga('send', type, fields))
    .ignoreElements()
    .catch(createErrorObservable);
}
