// Vytvoření dataLayer
window.dataLayer = window.dataLayer || [];

// Vytvoření objektu, přes který budeme k window.dataLayer přistupovat
(function (window) {
    window.GoogleDataLayer = {
        getDataLayer: function () {
            return window.dataLayer;
        },

        load: function () {
            this._formatFields();
            return this;
        },

        push: function (data) {
            if (null !== data) {
                switch (this.fields.page.environment) {
                    case "dev":
                        const events = {};
                        events[data.hasOwnProperty("event") ? data.event : "0"] = data;
                        console.log({
                            "GoogleDataLayer": {
                                "request": {events: events},
                                "dataLayer": window.dataLayer,
                            }
                        });
                        break;
                    case "live":
                        window.dataLayer.push(data);
                        //console.log(data)
                        break;
                }
            }
        },

        _formatFields: function () {
            this.fields = window.gtm;
            this._formatRecursively(this.fields);
        },

        _formatRecursively: function (object) {
            for (const key in object) {
                if ("object" === typeof object[key] && null !== object[key] && (!Array.isArray(object[key]) || (Array.isArray(object[key]) && object[key].length > 0))) {
                    this._formatRecursively(object[key]);
                } else if (object.hasOwnProperty(key)) {
                    if (null === object[key]) {
                        object[key] = this._format(object[key], "number")
                    }
                    if ("" === object[key]) {
                        object[key] = this._format(object[key], "string")
                    }
                    if (Array.isArray(object[key])) {
                        object[key] = this._format(object[key], "array")
                    }
                }
            }
        },

        _format: function (value, type) {
            switch (type) {
                case "array":
                    if (!Array.isArray(value)) {
                        return undefined;
                    }
                    if (0 === value.length) {
                        return undefined;
                    }
                    return value;
                case "string":
                    if (null === value || "" === value || (Array.isArray(value) && 0 === value.length)) {
                        return undefined;
                    }
                    return String(value);
                case "number":
                    if (null === value || "" === value) {
                        return null;
                    }
                    if (isNaN(value)) {
                        return null;
                    }
                    value = parseFloat(String(value).replace(/ /g, '').replace(/,/g, '.'));
                    return +(Math.round(value + "e+2") + "e-2");
            }
        },
    };
})(window);
window.GoogleDataLayer.load();

function gtag() {
    window.dataLayer.push(arguments);
}

// Společný / iniciační push
if (window.GoogleDataLayer.fields.settings.useGA4) {
    window.GoogleDataLayer.push({
        "user": window.GoogleDataLayer.fields.user,
        "page": window.GoogleDataLayer.fields.page,
        "cart": window.GoogleDataLayer.fields.cart,
        "category": window.GoogleDataLayer.fields.category,
        "products": window.GoogleDataLayer.fields.products,
        "_clear": window.GoogleDataLayer.fields["_clear"],
    });
}

// Kód GTM
(function (w, d, s, l, i) {
    w[l] = w[l] || [];
    w[l].push({
        'gtm.start':
            new Date().getTime(), event: 'gtm.js'
    });
    var f = d.getElementsByTagName(s)[0],
        j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : '';
    j.async = true;
    j.src =
        'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
    f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', window.GoogleDataLayer.fields.settings.gtmCode);

// Push základních dat
gtag('config',  window.GoogleDataLayer.fields.settings.ganalyticsID);

// Push všech ostatních eventů
if ("undefined" !== typeof window.GoogleDataLayer.fields.events) {
    for (let [name, data] of Object.entries(window.GoogleDataLayer.fields.events)) {
        window.GoogleDataLayer.push(data);
    }
}