var messages = {
    en: {
        outOfStock:
            "The selected products are out of stock. Please contact support at support@true-client-support.com",
        error: "Something went wrong. Please try again or contact support at support@true-client-support.com",
    },
    de: {
        outOfStock:
            "Die ausgewählten Produkte sind nicht vorrätig. Bitte kontaktieren Sie den Support unter support@true-client-support.com",
        error: "Etwas ist schief gelaufen. Bitte versuchen Sie es erneut oder kontaktieren Sie den Support unter support@true-client-support.com",
    },
    fr: {
        outOfStock:
            "Les produits sélectionnés ne sont pas en stock. Veuillez contacter le support à support@true-client-support.com",
        error: "Quelque chose s'est mal passé. Veuillez réessayer ou contacter le support à support@true-client-support.com",
    },
    it: {
        outOfStock:
            "I prodotti selezionati non sono disponibili. Contatta il supporto all'indirizzo support@true-client-support.com",
        error: "Qualcosa è andato storto. Per favore riprova o contatta il supporto all'indirizzo support@true-client-support.com",
    },
    es: {
        outOfStock:
            "Los productos seleccionados no están en stock. Póngase en contacto con soporte en support@true-client-support.com",
        error: "Algo salió mal. Por favor, inténtelo de nuevo o comuníquese con soporte en support@true-client-support.com",
    },
    sv: {
        outOfStock:
            "De valda produkterna är slut i lager. Kontakta supporten på support@true-client-support.com",
        error: "Något gick fel. Försök igen eller kontakta supporten på support@true-client-support.com",
    },
    pt: {
        outOfStock:
            "Os produtos selecionados estão fora de estoque. Entre em contato com o suporte em support@true-client-support.com",
        error: "Algo deu errado. Tente novamente ou entre em contato com o suporte em support@true-client-support.com",
    },
    ja: {
        outOfStock:
            "選択された商品は在庫切れです。support@true-client-support.com までサポートにお問い合わせください",
        error: "問題が発生しました。再度お試しいただくか、support@true-client-support.com までサポートにお問い合わせください",
    },
    da: {
        outOfStock:
            "De valgte produkter er ikke på lager. Kontakt support på support@true-client-support.com",
        error: "Noget gik galt. Prøv igen eller kontakt support på support@true-client-support.com",
    },
    no: {
        outOfStock:
            "De valgte produktene er ikke på lager. Kontakt support på support@true-client-support.com",
        error: "Noe gikk galt. Prøv igjen eller kontakt support på support@true-client-support.com",
    },
    fi: {
        outOfStock:
            "Valitut tuotteet ovat loppuneet varastosta. Ota yhteyttä tukeen osoitteessa support@true-client-support.com",
        error: "Jokin meni pieleen. Yritä uudelleen tai ota yhteyttä tukeen osoitteessa support@true-client-support.com",
    },
    el: {
        outOfStock:
            "Τα επιλεγμένα προϊόντα δεν είναι διαθέσιμα. Παρακαλούμε επικοινωνήστε με την υποστήριξη στο support@true-client-support.com",
        error: "Κάτι πήγε στραβά. Δοκιμάστε ξανά ή επικοινωνήστε με την υποστήριξη στο support@true-client-support.com",
    },
    nl: {
        outOfStock:
            "De geselecteerde producten zijn niet op voorraad. Neem contact op met de support via support@true-client-support.com",
        error: "Er is iets misgegaan. Probeer het opnieuw of neem contact op met de support via support@true-client-support.com",
    },
    cs: {
        outOfStock:
            "Vybrané produkty nejsou skladem. Kontaktujte prosím podporu na support@true-client-support.com",
        error: "Něco se pokazilo. Zkuste to prosím znovu nebo kontaktujte podporu na support@true-client-support.com",
    },
    pl: {
        outOfStock:
            "Wybrane produkty są niedostępne. Skontaktuj się z pomocą techniczną pod adresem support@true-client-support.com",
        error: "Coś poszło nie tak. Spróbuj ponownie lub skontaktuj się z pomocą techniczną pod adresem support@true-client-support.com",
    },
    tr: {
        outOfStock:
            "Seçilen ürünler stokta yok. Lütfen support@true-client-support.com adresinden destek ile iletişime geçin",
        error: "Bir şeyler yanlış gitti. Lütfen tekrar deneyin veya support@true-client-support.com adresinden destek ile iletişime geçin",
    },
    hu: {
        outOfStock:
            "A kiválasztott termékek nincsenek raktáron. Kérjük, vegye fel a kapcsolatot az ügyfélszolgálattal a support@true-client-support.com címen",
        error: "Valami hiba történt. Kérjük, próbálja újra, vagy vegye fel a kapcsolatot az ügyfélszolgálattal a support@true-client-support.com címen",
    },
};

var langAliases = {
    nb: "no",
    nn: "no",
    "pt-br": "pt",
    "pt-pt": "pt",
    "zh-cn": "ja",
    sv: "sv",
    "sv-se": "sv",
};

function t(key, lang) {
    var code = langAliases[lang] || lang || "en";
    return (messages[code] && messages[code][key]) || messages.en[key];
}

function getCookie(name, defaultValue) {
    if (defaultValue === undefined) defaultValue = null;
    var match = document.cookie.match(
        new RegExp(
            "(?:^|;\\s*)" +
                name.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1") +
                "=([^;]*)",
        ),
    );
    return match ? decodeURIComponent(match[1]) : defaultValue;
}

function roundUp2(value) {
    return Math.ceil((value + Number.EPSILON) * 100) / 100;
}

function parsePrice(text) {
    var num = text.replace(/[^0-9.,]/g, "").replace(/,/, ".");
    return parseFloat(num) || 0;
}

function isFreeShippingText(text) {
    if (!text || !/\d/.test(text)) return true;
    if (parsePrice(text) === 0) return true;
    var freeKeywords =
        /free|gratis|gratuit|бесплатн|безплатн|bezpłatn|ingyen|ilmainen|fritt|kosteloos|zdarma|ücretsiz|δωρεάν|送料無料/i;
    return freeKeywords.test(text);
}

(function () {
    var s = document.createElement("style");
    s.textContent = "@keyframes cartSpin{to{transform:rotate(360deg)}}";
    document.head.appendChild(s);
})();

function showFormMessage(form, text, type) {
    var old = form.querySelector(".cart-message");
    if (old) old.remove();

    var div = document.createElement("div");
    div.className = "cart-message";
    div.style.cssText =
        "padding:12px 16px;margin-top:16px;border-radius:8px;font-size:14px;line-height:1.5;" +
        (type === "error"
            ? "background:#fef2f2;color:#dc2626;border:1px solid #fecaca;"
            : "background:#f0fdf4;color:#16a34a;border:1px solid #bbf7d0;");
    div.textContent = text;

    var container = form.querySelector(".cart-box") || form;
    container.appendChild(div);

    setTimeout(function () {
        div.remove();
    }, 10000);
}

function setLoading(form, loading) {
    var overlay = form.querySelector(".cart-loader");
    var btn =
        form.querySelector(".shipping-footer__submit") ||
        form.querySelector(".btn-nav .btn") ||
        form.querySelector('button[type="submit"]');

    if (loading) {
        if (overlay) return;
        overlay = document.createElement("div");
        overlay.className = "cart-loader";
        overlay.style.cssText =
            "position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(255,255,255,0.7);display:flex;align-items:center;justify-content:center;z-index:10;border-radius:8px;";
        overlay.innerHTML =
            '<div style="width:36px;height:36px;border:3px solid #e5e7eb;border-top-color:#2563eb;border-radius:50%;animation:cartSpin 0.7s linear infinite;"></div>';
        form.style.position = "relative";
        form.appendChild(overlay);
        if (btn) btn.disabled = true;
    } else {
        if (overlay) overlay.remove();
        if (btn) btn.disabled = false;
    }
}

function showFormError(form, lang) {
    showFormMessage(form, t("error", lang), "error");
}

function submitCartForm(form) {
    if (!form) return;
    console.log("Processing form:", form);

    var urlParams = new URL(window.location.href).searchParams;
    var products = {};
    var qtyInputs = form.querySelectorAll('input[name^="set"]');
    var product_total = 0;

    qtyInputs.forEach(function (input) {
        var qty = parseInt(input.value) || 0;
        if (qty === 0) return;

        var row = input.closest(".tbl__tbody-tr") || input.closest("tr");
        if (!row) return;

        var priceEl =
            row.querySelector(".tbl__tbody-td--price .tbl__tbody-td-inner") ||
            row.querySelector(".tbl__tbody-td--price");

        if (!priceEl) {
            var cells = row.querySelectorAll("td");
            for (var i = 0; i < cells.length; i++) {
                var cellText = cells[i].textContent.trim();
                if (
                    (cellText.includes("$") ||
                        cellText.includes("€") ||
                        /\d+[.,]\d+/.test(cellText)) &&
                    !cells[i].querySelector("input")
                ) {
                    priceEl = cells[i];
                    break;
                }
            }
        }

        var price = parsePrice(priceEl ? priceEl.textContent.trim() : "0");
        var pkgId = input.name.replace("set", "");

        products[pkgId] = { qty: qty, price: price };
        product_total += qty * price;
    });

    if (window.debug_flat_data) {
        console.log(products);
        return;
    }

    var shippingInput = form.querySelector(
        'input[name="shipping_method_id"]:checked',
    );
    var shippingMethodVal = shippingInput ? shippingInput.value : "1";
    var shipping = shippingMethodVal == "2" ? "ems" : "regular";

    var defaultShippingPrice = shipping === "ems" ? 26.72 : 8.91;
    var shippingPrice = null;
    var rawShippingText = null;

    if (shippingInput) {
        var oldDesignRow = shippingInput.closest("tr.tbl__tbody-tr");
        if (oldDesignRow) {
            var oldPriceEl =
                oldDesignRow.querySelector(
                    ".tbl__tbody-td--price .tbl__tbody-td-inner",
                ) || oldDesignRow.querySelector(".tbl__tbody-td--price");
            if (oldPriceEl) rawShippingText = oldPriceEl.textContent.trim();
        }

        if (!rawShippingText) {
            var newDesignRow = shippingInput.closest("li");
            if (newDesignRow) {
                var newPriceEl = newDesignRow.querySelector(".shipping");
                if (newPriceEl) rawShippingText = newPriceEl.textContent.trim();
            }
        }

        if (rawShippingText !== null) {
            if (isFreeShippingText(rawShippingText)) {
                shippingPrice = 0;
            } else {
                shippingPrice = parsePrice(rawShippingText);
            }
            console.log(
                "[Cart] Shipping from HTML:",
                shippingPrice,
                "(raw: '" + rawShippingText + "', isFree:",
                isFreeShippingText(rawShippingText) + ")",
            );
        }
    }

    if (shippingPrice === null || isNaN(shippingPrice)) {
        shippingPrice = defaultShippingPrice;
        console.warn(
            "[Cart] Shipping element not found in HTML, using hardcoded fallback:",
            shippingPrice,
        );
    }

    var checkout_total = product_total + shippingPrice;
    var lang = getCookie("lang") || getCookie("LANG") || "en";
    var cur = getCookie("cur") || "USD";

    var body = {
        method: "create_checkout",
        products: products,
        shipping: shipping,
        shipping_price: shippingPrice,
        bonus_id: null,
        product_total: roundUp2(product_total),
        checkout_total: roundUp2(checkout_total),
        visit_id: crypto.randomUUID(),
        session_id: crypto.randomUUID(),
        aff_id: Number("2091") ?? 0,
        currency: cur,
        language: lang,
        ip: "216.73.217.176",
        domain_from: window.location.host,
        useragent: navigator.userAgent,
        track_id: "rxp_adapter",
        client_timestamp: new Date().toISOString(),
        network_click_id: crypto.randomUUID(),
        referrer: navigator.referrer || document.referrer || "",
        design_id: 13,
        utm_source: urlParams.get("utm_source"),
        utm_medium: urlParams.get("utm_medium"),
        utm_campaign: urlParams.get("utm_campaign"),
        utm_term: urlParams.get("utm_term"),
        utm_content: urlParams.get("utm_content"),
        country_code: "US",
        matcher: "rxp",
    };

    if (window.debug_request_body) {
        console.log(body);
        return;
    }

    setLoading(form, true);

    fetch("/api.php", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(body),
    })
        .then(function (res) {
            return res.json();
        })
        .then(function (data) {
            setLoading(form, false);
            if (data && data.fail && data.fail.unmatched_products) {
                showFormMessage(form, t("outOfStock", lang), "error");
                return;
            }
            if (data && data.id) {
                var redirect =
                    "/checkout.php?id=" +
                    data.id +
                    "&lang=" +
                    lang +
                    "&cur=" +
                    cur;
                if (data.warnings && data.warnings.unmatched_products)
                    redirect += "&warn=1";
                window.location.href = redirect;
                return;
            }
            showFormError(form, lang);
        })
        .catch(function () {
            setLoading(form, false);
            showFormError(form, lang);
        });
}

document.addEventListener("submit", function (e) {
    if (
        e.target &&
        (e.target.matches("form.cart") ||
            e.target.matches('form[action*="cart.php"]'))
    ) {
        e.preventDefault();
        submitCartForm(e.target);
    }
});

function getCartForm() {
    return (
        document.querySelector("form.cart") ||
        document.querySelector('form[action*="cart.php"]')
    );
}

function handler() {
    submitCartForm(getCartForm());
}

(function () {
    function patch() {
        var form = document.checkout;
        if (form && form.submit !== handler) form.submit = handler;
    }
    patch();
    setInterval(patch, 500);
})();
