'use strict';

import Raven from 'raven-js';

import AppConstants from '../constants/application_constants';

/**
 * Logs an error in to the console but also sends it to
 * Sentry.
 * Optionally, a comment can be defined.
 * @param  {Error} error    a Javascript error
 * @param  {boolean} ignoreSentry Defines whether or not the error should be submitted to Sentry
 * @param  {string} comment  Will also be submitted to Sentry, but will not be logged
 */
function logGlobal(error, comment, ignoreSentry) {
    console.error(error);

    if (error.hasOwnProperty('json')) {
        comment = {
            ...comment,
            json: error.json
        };
    }

    if (!ignoreSentry) {
        Raven.captureException(error, comment ? { extra: { comment } } : undefined);
    }
}

export function initLogging() {
    // Initialize Raven for logging on Sentry
    Raven.config(AppConstants.raven.url, {
        release: AppConstants.version,
        ignoreErrors: AppConstants.errorMessagesToIgnore
    }).install();

    window.onerror = Raven.process;

    console.logGlobal = logGlobal;
}

/*
 * Gets the json errors from the error as an array
 * @param  {Error} error A Javascript error
 * @return {Array}       List of json errors
 */
export function getJsonErrorsAsArray(error) {
    const { json: { errors = {} } = {} } = error;

    const errorArrays = Object
        .keys(errors)
        .map((errorKey) => {
            return errors[errorKey];
        });

    // Collapse each errorKey's errors into a flat array
    return [].concat(...errorArrays);
}

/*
 * Tries to get an error message from the error, either by using its notification
 * property or first json error (if any)
 * @param  {Error} error A Javascript error
 * @return {string}      Error message string
 */
export function getErrorNotificationMessage(error) {
    return (error && error.notification) || getJsonErrorsAsArray(error)[0] || '';
}