/// <reference path="../../tracking/IPlugin.ts" />
/// <reference path="../../tracking/PluginManager.ts" />
/// <reference path="../../util/ArrayUtils.ts" />
/// <reference path="../event/AbstractEvent.ts" />
/// <reference path="../event/ProductAddToCartEvent.ts" />
/// <reference path="../event/ProductBuyEvent.ts" />
/// <reference path="../event/ProductViewEvent.ts" />
var econda;
(function (econda) {
    var recengine;
    (function (recengine) {
        var history;
        (function (history) {
            var TrackingPluginManager = econda.tracking.PluginManager;
            /**
             * Listen to tracking requests and write product events to {@link econda.recengine.history.VisitorHistory}.
             * See {@link econda.recengine.VisitorProfile} for documentation.
             *
             * Disable tracking:
             *     econdaConfig.crosssellTrackEvents = false;
             *
             * If this config option is true or not set, this listener will be enabled.
             *
             * @class econda.recengine.history.TrackingListener
             */
            var TrackingListener = (function () {
                function TrackingListener() {
                }
                /**
                 * Get singleton instance of tracking listener.
                 * @static
                 */
                TrackingListener.getInstance = function () {
                    if (TrackingListener._instance === null) {
                        TrackingListener._instance = new TrackingListener();
                    }
                    return TrackingListener._instance;
                };
                /**
                 * Called on each tracking request
                 */
                TrackingListener.prototype.onRequest = function (emosProperties, cfg) {
                    var events = this.createEventsFromTrackingData(emosProperties, cfg.getPidIndex());
                    for (var i = 0; i < events.length; i++) {
                        econda['data'].visitor.getHistory().add(events[i]);
                    }
                    if (econda.util.ArrayUtils.isArray(emosProperties.arpprops)) {
                        this.storeArpProps(emosProperties.arpprops);
                    }
                };
                TrackingListener.prototype.storeArpProps = function (arpProps) {
                    for (var _i = 0, arpProps_1 = arpProps; _i < arpProps_1.length; _i++) {
                        var arpProp = arpProps_1[_i];
                        var arpKey = arpProp[0];
                        var arpValue = arpProp[1];
                        econda['data'].visitor.setCustomProperty(arpKey, arpValue);
                    }
                };
                /**
                 * Converts emos properties data to events
                 * @private
                 */
                TrackingListener.prototype.createEventsFromTrackingData = function (emosProperties, pidIndex) {
                    var events = [];
                    if (typeof emosProperties.ec_Event === 'object') {
                        for (var i = 0; i < emosProperties.ec_Event.length; i++) {
                            var e = this.createEventFromEcEventItem(emosProperties.ec_Event[i], pidIndex);
                            if (e) {
                                events.push(e);
                            }
                        }
                    }
                    return events;
                };
                /**
                 * Converts a single product event from emos tracking properties to recengine event.
                 * @private
                 */
                TrackingListener.prototype.createEventFromEcEventItem = function (ecEvent, pidIndex) {
                    var createEvent = function (ecEventType, eventConfig) {
                        if (eventConfig === void 0) { eventConfig = null; }
                        var event = null;
                        switch (String(ecEventType).toLowerCase()) {
                            case 'view':
                                event = new econda.recengine.event.ProductViewEvent(eventConfig);
                                break;
                            case 'c_add':
                                event = new econda.recengine.event.ProductAddToCartEvent(eventConfig);
                                break;
                            case 'buy':
                                event = new econda.recengine.event.ProductBuyEvent(eventConfig);
                                break;
                        }
                        return event;
                    };
                    var event = null;
                    if (typeof ecEvent.type !== 'undefined') {
                        // { type: 'view', pid: ID, ... }
                        event = createEvent(ecEvent.type, {
                            product: { id: ecEvent.pid || null, sku: ecEvent.sku || null }
                        });
                    }
                    else if (typeof ecEvent[1] !== 'undefined') {
                        //  ['view', ID, NAME, PREIS, KATEGORIE, ANZAHL, VARIANTE1, VARIANTE2, VARIANTE3]
                        event = createEvent(ecEvent[0], {
                            product: { id: ecEvent[pidIndex], sku: null }
                        });
                    }
                    return event;
                };
                /**
                 * Register instance of listener at tracking plug-in manager
                 * @static
                 */
                TrackingListener.enable = function () {
                    TrackingPluginManager.registerPlugin(TrackingListener.getInstance());
                };
                /**
                 * Unregister listener at tracking plug-in manager
                 * @static
                 */
                TrackingListener.disable = function () {
                    TrackingPluginManager.unregisterPlugin(TrackingListener.getInstance());
                };
                TrackingListener._instance = null;
                return TrackingListener;
            }());
            history.TrackingListener = TrackingListener;
            // auto enable tracking for events
            if (typeof econdaConfig.crosssellTrackEvents === 'undefined' || econdaConfig.crosssellTrackEvents == true) {
                TrackingListener.enable();
            }
        })(history = recengine.history || (recengine.history = {}));
    })(recengine = econda.recengine || (econda.recengine = {}));
})(econda || (econda = {}));