'use strict';

/**
 * @classdesc The class allows inheriting classes to log events based on a sampling
 * rate if sampling is enabled.
 *
 * If the schema uses different sampling rates for different events, `samplingRate`
 * can also be passed to individual events.
 *
 * @example
 * var mySchema = new mw.eventLog.Schema( 'Name', 0.01, { skin: 'minerva' } );
 * // Log the following event at the default sampling rate of 0.01.
 * mySchema.log( { action: 'viewed' } );
 * // Log the following event at the sampling rate of 0.2.
 * mySchema.log( { action: 'clicked' }, 0.2 );
 *
 * @class mw.eventLog.Schema
 * @param {string} name Schema name to log to.
 * @param {number} [samplingRate=1] The rate at which sampling is performed.
 *  The values are between 0 and 1 inclusive.
 * @param {Object} [defaults] A set of defaults to log to the schema. Once
 *  these defaults are set the values will be logged along with any additional
 *  fields that are passed to the log method.
 */
function Schema( name, samplingRate, defaults ) {
	if ( !name ) {
		throw new Error( 'name is required' );
	}

	this.name = name;
	this.populationSize = samplingRate !== undefined ? ( 1 / samplingRate ) : 1;
	this.defaults = defaults || {};
}

/**
 * Log an event via the EventLogging subscriber.
 *
 * @method log
 * @param {Object} data Data to log
 * @param {number} [samplingRate] Number between 0 and 1.
 *  Defaults to `this.samplingRate`.
 * @memberof mw.eventLog.Schema
 * @instance
 */
Schema.prototype.log = function ( data, samplingRate ) {
	// Convert rate to population size
	const pop = samplingRate !== undefined ? ( 1 / samplingRate ) : this.populationSize;

	if ( mw.eventLog.pageviewInSample( pop ) ) {
		mw.track(
			'event.' + this.name,
			Object.assign( {}, this.defaults, data )
		);
	}
};

module.exports = Schema;