'use strict';

var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
/**
 * Automatically sends search event to Klaviyo on search, recommendations and category navigation.
 *
 * @param params
 * @returns
 */
function klaviyo(params = {
    productAttributes: [
        "id",
        "name",
        "url",
        "sku",
        "imageUrl",
        "price",
        "salePrice",
    ],
    productLimit: 10,
    language: "en",
}) {
    return {
        klevuModifierId: "kleviyo",
        ssrOnResultFE: true,
        onResult: (response, query) => {
            var _a;
            // make sure that Klaviyo array is available
            if (!globalThis._learnq) {
                globalThis._learnq = globalThis._learnq || [];
            }
            if (![
                "search",
                "categoryMerchandising",
                "recommendation",
                "kmcRecommendation",
            ].includes(query.klevuFunctionId)) {
                console.error("Klevu Klaviyo modifier only works with search, categoryMerchandising, recommendation and kmcRecommendation functions");
                return;
            }
            for (const q of (_a = query.queries) !== null && _a !== void 0 ? _a : []) {
                // if there is a fallback use that
                const fallbackId = `${q.id}-fallback`;
                const res = response.queryExists(fallbackId)
                    ? response.queriesById(`${q.id}-fallback`)
                    : response.queriesById(q.id);
                if (!res) {
                    continue;
                }
                const products = res === null || res === void 0 ? void 0 : res.records.slice(0, params.productLimit);
                if (!products || products.length == 0) {
                    continue;
                }
                let annotations;
                res.hooks.push((clickParams) => __awaiter(this, void 0, void 0, function* () {
                    var _b, _c, _d, _e;
                    if (!annotations) {
                        annotations = yield ((_b = res.annotationsById) === null || _b === void 0 ? void 0 : _b.call(res, products[0].id, params.language));
                    }
                    const clickedProduct = res.records.find((p) => p.id === clickParams.productId);
                    (_c = globalThis._learnq) === null || _c === void 0 ? void 0 : _c.push([
                        "track",
                        `Klevu ${clickParams.type}`,
                        {
                            "Search Term": res.meta.searchedTerm,
                            "Search Term(full)": (_d = annotations === null || annotations === void 0 ? void 0 : annotations.annotations) === null || _d === void 0 ? void 0 : _d.fullTerm,
                            Subjects: (_e = annotations === null || annotations === void 0 ? void 0 : annotations.annotations) === null || _e === void 0 ? void 0 : _e.subjects,
                            "Total Number of Product Results": res.meta.totalResultsFound,
                            "Product Clicked": clickedProduct &&
                                params.productAttributes.reduce((acc, curr) => {
                                    acc[curr] = clickedProduct[curr];
                                    return acc;
                                }, {}),
                            "Search Results": products.map((p) => {
                                return params.productAttributes.reduce((acc, curr) => {
                                    acc[curr] = p[curr];
                                    return acc;
                                }, {});
                            }),
                        },
                    ]);
                }));
            }
        },
    };
}

exports.klaviyo = klaviyo;

//# sourceMappingURL=klaviyo-c99982b1.js.map