/** @odoo-module */
/**
 * Block barcode processing while ErrorBarcodePopup is visible by taking
 * exclusive control of the barcode reader, and release it when closing.
 */

import Registries from "point_of_sale.Registries";
import ErrorBarcodePopup from "point_of_sale.ErrorBarcodePopup";
import { useBarcodeReader } from "point_of_sale.custom_hooks";

const ErrorBarcodePopupBlock = (ErrorPopup) =>
    class extends ErrorPopup {
        setup() {
            super.setup(...arguments);
            // Prevent keyboard-triggered clicks (Enter on focused button)
            owl.onMounted(() => {
                this.__clickHandler = (ev) => {
                    // Keyboard-triggered clicks usually have detail === 0
                    if (ev && ev.detail === 0) {
                        ev.preventDefault();
                        ev.stopPropagation();
                    }
                };
                if (this.el) {
                    this.el.addEventListener('click', this.__clickHandler, true);
                }
            });


            // Take exclusive control using POS hook so subsequent scans are ignored
            useBarcodeReader({
                product: () => {},
                quantity: () => {},
                weight: () => {},
                price: () => {},
                client: () => {},
                discount: () => {},
                cashier: () => {},
                error: () => {},
                gs1: () => {},
            }, true);
        }

        willUnmount() {
            // useBarcodeReader cleans up automatically on unmount
            if (this.el && this.__clickHandler) {
                this.el.removeEventListener('click', this.__clickHandler, true);
            }
            super.willUnmount(...arguments);
        }

        // Only accept real pointer clicks to close the popup; ignore keyboard/programmatic events
        async confirm(ev) {
            if (ev && ev.type === 'click' && ev.isTrusted && ev.detail > 0) {
                return super.confirm();
            }
        }
        cancel(ev) {
            if (ev && ev.type === 'click' && ev.isTrusted && ev.detail > 0) {
                return super.cancel();
            }
        }
    };

Registries.Component.extend(ErrorBarcodePopup, ErrorBarcodePopupBlock);

export default ErrorBarcodePopup;
