var brx = brx || {};
brx.productView = brx.productView || {};

brx.productView.crossSell = ( function () {
    var getData = function(args) {
        getExternalData(args);
    };
    var getExternalData = function(args) {
        Analytics.getCrossSellData( {
           pageContext: args.pageContext,
           parentProductIds: args.productIds,
           callback: args.callback
        } );        
    };
    var getInternalData = function(args) {
        var sku = args.sku;
        var worksWith = sku.worksWith;
        var productIds = [];
        var skuIds = [];
        var keys = [];
        
        worksWith.each(function(w) {
            var split = w.split("~"); //prodid, skuid
            keys[split[0]] = split[1];
            productIds.push(split[0]);
        });

        var recommendedProductDataParams = {};
        recommendedProductDataParams.productIds = productIds;
        recommendedProductDataParams.keys = keys;    
        
        recommendedProductDataParams.pageDataKey = 'catalog.' + args.pageContext + '.recommendedProducts';
        
        var paramRb = generic.rb("page_data_configuration");
        if (paramRb.get("catalog.spp.productFields") != "catalog.spp.productFields") {
            recommendedProductDataParams.productFields = paramRb.get("catalog.spp.productFields");
            recommendedProductDataParams.skuFields = paramRb.get("catalog.spp.skuFields");
        }
        else {
            // we rely on the hard-coded default fields and accept risk of field mismatches
        }

        var callback = function(callerArgs, responseData) {
            var path = 'catalog.' + callerArgs.pageContext + '.recommendedProducts';
            //Notify analytics.js that this exists instead of RPC data
            document.fire("PAGEDATA:RESULT", path);
            
            // here data contains the www products for all skus of the product.
            // Need to get the products out of that list that go with the
            // current sku
            var sku = callerArgs.sku;
            var worksWith = sku.worksWith;
                        
            var products = responseData.products.findAll( function (p) {
                return generic.productData.validateSkusArray(p.skus);
            });
                        
            products = products.findAll(function(p) {
                return typeof keys[p.PRODUCT_ID] !== "undefined";
            });
            
            var temp = [];
            productIds.each(function(id) {
                var r = products.find(function(p) {
                    return p.PRODUCT_ID == id
                });

                if (r) {
                    temp.push(r);
                }
            });
            
            products = temp;
            
            products.each(function(p) {
                var skuIds = keys[p.PRODUCT_ID].split(".") || [];
                var firstSkuId = skuIds[0];
                var skus = p.skus;

                var query = "$[?(@.SKU_ID == '" + firstSkuId + "')]";
                var www_sku = jsonPath(skus, query)[0];

                if (skuIds.length > 1) {
                    p.hideDetails = true;
                } else {
                    p.hideDetails = false;
                }

                if (www_sku) {
                    p.www_sku = www_sku;
                } else {
                    p.www_sku = undefined;
                }
            });
            
            callerArgs.callback({products: products, result: responseData.result});
        }.curry(args);
    
        recommendedProductDataParams.callback = callback;
        
        generic.productData.getProductsData(recommendedProductDataParams);
    };
    var that = {
        init : function(args) {
            if (!args.bypassCM) {
                var data = getData({
                    productIds: args.productIds,
                    pageContext: args.pageContext || "spp",
                    callback: function(data) {
                        if (typeof data !== 'undefined') {
                            page_data.catalog[args.pageContext].CMOnly = true;
                            console.log("Coremetrics recommendations only");
                            args.callback(data);
                        } else { // if no data in callback, use internal data source
                            getInternalData(args);
                        }
                    }
                });
            } else {
                getInternalData(args);
            }
        }
    };
    return that;
}());


