/**
 * Plugin Name:  Peptio – Shipping Señorita 👩🏻‍💼 EU Dispatch Board
 * Description:  Dedicated Europe Warehouse dispatch kiosk using Peptio fulfilment routing, EU warehouse stock, tracking scan dispatch, QR, printing, notes, email status and dark mode.
 * Version:      1.0.0
 * Author:       Peptio
 *
 * CODE SNIPPETS VERSION:
 * Paste into a PHP snippet without adding <?php.
 * Set the snippet to run everywhere.
 *
 * URL:
 * ?shipping_senorita=1
 *
 * IMPORTANT:
 * - This board ONLY shows orders assigned to warehouse "eu".
 * - Warehouse assignment comes from:
 *   _pepti_fulfilment_warehouse
 * - Customer country is NOT used as the authority.
 * - HQ fallback orders therefore remain on the HQ dispatch system.
 * - Stock routing/deduction remains handled by
 *   Peptio – Frontend Warehouse Stock Routing.
 */

if (!defined('ABSPATH')) {
	exit;
}

if (defined('PEPTI_SHIPPING_SENORITA_LOADED')) {
	return;
}

define('PEPTI_SHIPPING_SENORITA_LOADED', true);

/* ==========================================================================
 * CONFIGURATION
 * ========================================================================== */

if (!defined('PEPTI_SS_VERSION')) {
	define('PEPTI_SS_VERSION', '1.0.0');
}

/*
 * If Dispatch Darian already has LE_DB_PASSWORD defined,
 * Señorita will use the same password by default.
 *
 * Otherwise change this value.
 */
if (!defined('PEPTI_SS_PASSWORD')) {
	define(
		'PEPTI_SS_PASSWORD',
		defined('LE_DB_PASSWORD')
			? LE_DB_PASSWORD
			: 'change-me'
	);
}

if (!defined('PEPTI_SS_SESSION_HOURS')) {
	define('PEPTI_SS_SESSION_HOURS', 0);
}

if (!defined('PEPTI_SS_BIND_IP')) {
	define('PEPTI_SS_BIND_IP', false);
}

if (!defined('PEPTI_SS_BIND_UA')) {
	define('PEPTI_SS_BIND_UA', false);
}

if (!defined('PEPTI_SS_MAX_ROWS')) {
	define('PEPTI_SS_MAX_ROWS', 800);
}

if (!defined('PEPTI_SS_REFRESH_SECONDS')) {
	define('PEPTI_SS_REFRESH_SECONDS', 90);
}

if (!defined('PEPTI_SS_EMAIL_CACHE_SECONDS')) {
	define('PEPTI_SS_EMAIL_CACHE_SECONDS', 180);
}

if (!defined('PEPTI_SS_SCAN_SECRET')) {
	define(
		'PEPTI_SS_SCAN_SECRET',
		defined('LE_SCAN_SECRET')
			? LE_SCAN_SECRET
			: 'change-this-to-a-long-random-secret'
	);
}

if (!defined('PEPTI_SS_WAREHOUSE')) {
	define('PEPTI_SS_WAREHOUSE', 'eu');
}

if (!defined('PEPTI_SS_WAREHOUSE_NAME')) {
	define('PEPTI_SS_WAREHOUSE_NAME', 'Europe Warehouse');
}

if (!defined('PEPTI_SS_BRAND_NAME')) {
	define(
		'PEPTI_SS_BRAND_NAME',
		defined('LE_BRAND_NAME')
			? LE_BRAND_NAME
			: get_bloginfo('name')
	);
}

if (!defined('PEPTI_SS_LOGO')) {
	define(
		'PEPTI_SS_LOGO',
		defined('LE_PRINTER_LOGO')
			? LE_PRINTER_LOGO
			: ''
	);
}

if (!defined('PEPTI_SS_NOTE_ROLES')) {
	define(
		'PEPTI_SS_NOTE_ROLES',
		defined('LE_DB_NOTE_ROLES')
			? LE_DB_NOTE_ROLES
			: 'administrator,shop_manager'
	);
}


/* ==========================================================================
 * SHARED ORDER META
 * ========================================================================== */

if (!defined('PEPTI_SS_META_WAREHOUSE')) {
	define(
		'PEPTI_SS_META_WAREHOUSE',
		'_pepti_fulfilment_warehouse'
	);
}

if (!defined('PEPTI_SS_META_WAREHOUSE_NAME')) {
	define(
		'PEPTI_SS_META_WAREHOUSE_NAME',
		'_pepti_fulfilment_warehouse_name'
	);
}

if (!defined('PEPTI_SS_META_ROUTING_COUNTRY')) {
	define(
		'PEPTI_SS_META_ROUTING_COUNTRY',
		'_pepti_routing_country'
	);
}

if (!defined('PEPTI_SS_META_FALLBACK')) {
	define(
		'PEPTI_SS_META_FALLBACK',
		'_pepti_warehouse_fallback_used'
	);
}

if (!defined('PEPTI_SS_META_ROUTING_ERROR')) {
	define(
		'PEPTI_SS_META_ROUTING_ERROR',
		'_pepti_warehouse_routing_error'
	);
}

if (!defined('PEPTI_SS_META_STOCK_DEDUCTED')) {
	define(
		'PEPTI_SS_META_STOCK_DEDUCTED',
		'_pepti_warehouse_stock_deducted'
	);
}


/*
 * Keep tracking metadata shared with Dispatch Darian.
 */
if (!defined('PEPTI_SS_META_TRACKING_NUM')) {
	define(
		'PEPTI_SS_META_TRACKING_NUM',
		defined('LE_META_TRACKING_NUM')
			? LE_META_TRACKING_NUM
			: '_le_tracking_number'
	);
}

if (!defined('PEPTI_SS_META_TRACKING_URL')) {
	define(
		'PEPTI_SS_META_TRACKING_URL',
		defined('LE_META_TRACKING_URL')
			? LE_META_TRACKING_URL
			: '_le_tracking_url'
	);
}

if (!defined('PEPTI_SS_META_CARRIER')) {
	define(
		'PEPTI_SS_META_CARRIER',
		defined('LE_META_DISP_CARRIER')
			? LE_META_DISP_CARRIER
			: '_le_dispatch_carrier'
	);
}

if (!defined('PEPTI_SS_META_SCANNED_AT')) {
	define(
		'PEPTI_SS_META_SCANNED_AT',
		defined('LE_META_SCANNED_AT')
			? LE_META_SCANNED_AT
			: '_le_scanned_at'
	);
}

if (!defined('PEPTI_SS_META_QR_USED')) {
	define(
		'PEPTI_SS_META_QR_USED',
		defined('LE_META_QR_USED')
			? LE_META_QR_USED
			: '_le_qr_used'
	);
}

if (!defined('PEPTI_SS_META_PRINTER_SENT_AT')) {
	define(
		'PEPTI_SS_META_PRINTER_SENT_AT',
		'_pepti_ss_printer_sent_at'
	);
}

if (!defined('PEPTI_SS_META_PRINTER_LAST')) {
	define(
		'PEPTI_SS_META_PRINTER_LAST',
		'_pepti_ss_printer_last_result'
	);
}


/* ==========================================================================
 * BASIC HELPERS
 * ========================================================================== */

function pepti_ss_plain_url() {

	return home_url(
		add_query_arg(
			[
				'shipping_senorita' => 1,
			],
			'/'
		)
	);
}


function pepti_ss_url_with_session(
	$token
) {

	return home_url(
		add_query_arg(
			[
				'shipping_senorita' => 1,
				'ss_session'       => $token,
			],
			'/'
		)
	);
}


function pepti_ss_session_key(
	$token
) {

	return 'pepti_ss_session_'
		. sanitize_key($token);
}


function pepti_ss_now() {

	return time();
}


function pepti_ss_make_token(
	$bytes = 32
) {

	try {

		$raw =
			random_bytes(
				max(
					16,
					(int) $bytes
				)
			);

	} catch (Throwable $error) {

		$raw =
			openssl_random_pseudo_bytes(
				max(
					16,
					(int) $bytes
				)
			);
	}

	return rtrim(
		strtr(
			base64_encode($raw),
			'+/',
			'-_'
		),
		'='
	);
}


function pepti_ss_normalise_tracking(
	$value
) {

	$value =
		(string) $value;

	$value =
		wp_strip_all_tags(
			$value
		);

	$value =
		preg_replace(
			'/[\x00-\x1F\x7F\x{200B}\x{200C}\x{200D}\x{FEFF}]+/u',
			'',
			$value
		);

	$value =
		strtoupper(
			trim($value)
		);

	$value =
		str_replace(
			[
				"\t",
				"\r",
				"\n",
				' ',
				'-',
				'–',
				'—',
			],
			'',
			$value
		);

	$value =
		preg_replace(
			'~[^A-Z0-9]+~',
			'',
			$value
		);

	return (string) $value;
}


function pepti_ss_sign_action(
	$purpose,
	$order_id,
	$ttl = 600
) {

	$expires =
		pepti_ss_now()
		+ max(
			60,
			(int) $ttl
		);

	$message =
		sanitize_key($purpose)
		. '|'
		. absint($order_id)
		. '|'
		. $expires;

	$signature =
		hash_hmac(
			'sha256',
			$message,
			PEPTI_SS_SCAN_SECRET
		);

	return [
		'ts'  => $expires,
		'sig' => $signature,
	];
}


function pepti_ss_check_action(
	$purpose,
	$order_id,
	$expires,
	$signature
) {

	$expires =
		(int) $expires;

	if (
		$expires
		< pepti_ss_now()
	) {
		return false;
	}

	$message =
		sanitize_key($purpose)
		. '|'
		. absint($order_id)
		. '|'
		. $expires;

	$expected =
		hash_hmac(
			'sha256',
			$message,
			PEPTI_SS_SCAN_SECRET
		);

	return hash_equals(
		$expected,
		(string) $signature
	);
}


/* ==========================================================================
 * SESSION
 * ========================================================================== */

function pepti_ss_session_create() {

	$token =
		pepti_ss_make_token(32);

	$data = [
		'created' =>
			pepti_ss_now(),

		'ip' =>
			(string) (
				$_SERVER['REMOTE_ADDR']
				?? ''
			),

		'ua' =>
			(string) (
				$_SERVER['HTTP_USER_AGENT']
				?? ''
			),
	];

	$key =
		pepti_ss_session_key(
			$token
		);

	$hours =
		(int)
		PEPTI_SS_SESSION_HOURS;

	if ($hours > 0) {

		set_transient(
			$key,
			$data,
			$hours
			* HOUR_IN_SECONDS
		);

	} else {

		add_option(
			$key,
			$data,
			'',
			false
		);
	}

	return $token;
}


function pepti_ss_session_destroy(
	$token
) {

	$key =
		pepti_ss_session_key(
			$token
		);

	delete_transient(
		$key
	);

	delete_option(
		$key
	);
}


function pepti_ss_session_get(
	$token
) {

	$token =
		sanitize_text_field(
			(string) $token
		);

	if ($token === '') {
		return false;
	}

	$key =
		pepti_ss_session_key(
			$token
		);

	$data =
		get_transient(
			$key
		);

	if (!$data) {

		$stored =
			get_option(
				$key,
				null
			);

		if (
			is_array($stored)
		) {
			$data =
				$stored;
		}
	}

	if (
		!is_array($data)
	) {
		return false;
	}

	if (
		PEPTI_SS_BIND_IP
		&& (
			(string) (
				$_SERVER['REMOTE_ADDR']
				?? ''
			)
			!==
			(string) (
				$data['ip']
				?? ''
			)
		)
	) {
		return false;
	}

	if (
		PEPTI_SS_BIND_UA
		&& (
			(string) (
				$_SERVER['HTTP_USER_AGENT']
				?? ''
			)
			!==
			(string) (
				$data['ua']
				?? ''
			)
		)
	) {
		return false;
	}

	return $data;
}


function pepti_ss_has_access(
	&$token = null
) {

	if (
		is_user_logged_in()
		&& current_user_can(
			'edit_shop_orders'
		)
	) {
		$token =
			null;

		return true;
	}

	$token =
		isset(
			$_GET['ss_session']
		)
			? sanitize_text_field(
				wp_unslash(
					$_GET[
						'ss_session'
					]
				)
			)
			: '';

	if (
		$token !== ''
		&& pepti_ss_session_get(
			$token
		)
	) {
		return true;
	}

	$token =
		null;

	return false;
}


/* ==========================================================================
 * WAREHOUSE AUTHORITY
 * ========================================================================== */

function pepti_ss_order_warehouse(
	$order
) {

	if (
		!$order
		instanceof WC_Order
	) {
		return '';
	}

	return sanitize_key(
		$order->get_meta(
			PEPTI_SS_META_WAREHOUSE,
			true
		)
	);
}


function pepti_ss_is_europe_order(
	$order
) {

	return (
		$order
		instanceof WC_Order
		&&
		pepti_ss_order_warehouse(
			$order
		)
		=== PEPTI_SS_WAREHOUSE
	);
}


function pepti_ss_require_europe_order(
	$order
) {

	return (
		$order
		instanceof WC_Order
		&&
		pepti_ss_is_europe_order(
			$order
		)
	);
}


/* ==========================================================================
 * COUNTRY
 * ========================================================================== */

function pepti_ss_order_country_code(
	$order
) {

	if (
		!$order
		instanceof WC_Order
	) {
		return '';
	}

	$country =
		strtoupper(
			trim(
				(string) (
					$order
						->get_shipping_country()
					?:
					$order
						->get_billing_country()
				)
			)
		);

	return preg_match(
		'/^[A-Z]{2}$/',
		$country
	)
		? $country
		: '';
}


function pepti_ss_order_country(
	$order
) {

	$code =
		pepti_ss_order_country_code(
			$order
		);

	if ($code === '') {
		return '—';
	}

	try {

		if (
			function_exists('WC')
			&& WC()
			&& WC()->countries
		) {

			$countries =
				WC()
					->countries
					->get_countries();

			if (
				isset(
					$countries[
						$code
					]
				)
			) {

				return $countries[
					$code
				];
			}
		}

	} catch (Throwable $error) {}

	return $code;
}


/* ==========================================================================
 * EU STOCK
 * ========================================================================== */

function pepti_ss_stock_owner_id(
	$product
) {

	if (
		!$product
		instanceof WC_Product
	) {
		return 0;
	}

	if (
		function_exists(
			'pepti_mw_stock_owner_id'
		)
	) {

		$owner =
			pepti_mw_stock_owner_id(
				$product
			);

		if (
			is_numeric($owner)
		) {

			return max(
				0,
				(int) $owner
			);
		}
	}

	return (int)
		$product->get_id();
}


function pepti_ss_get_eu_stock(
	$product
) {

	if (
		!$product
		instanceof WC_Product
	) {
		return 0.0;
	}

	$owner_id =
		pepti_ss_stock_owner_id(
			$product
		);

	if ($owner_id <= 0) {
		return 0.0;
	}

	if (
		function_exists(
			'pepti_mw_get_stock'
		)
	) {

		return (float)
			pepti_mw_get_stock(
				PEPTI_SS_WAREHOUSE,
				$owner_id
			);
	}

	/*
	 * Do NOT silently use HQ/WooCommerce stock for
	 * an EU operational board.
	 */
	return 0.0;
}


function pepti_ss_order_has_backorder(
	$order
) {

	if (
		!pepti_ss_is_europe_order(
			$order
		)
	) {
		return false;
	}

	$requirements =
		[];

	foreach (
		$order->get_items(
			'line_item'
		)
		as $item
	) {

		if (
			!$item
			instanceof WC_Order_Item_Product
		) {
			continue;
		}

		$product =
			$item->get_product();

		if (
			!$product
			instanceof WC_Product
		) {
			continue;
		}

		if (
			$product
				->backorders_allowed()
		) {
			continue;
		}

		$owner_id =
			pepti_ss_stock_owner_id(
				$product
			);

		if ($owner_id <= 0) {
			continue;
		}

		$quantity =
			max(
				0,
				(float)
				$item->get_quantity()
			);

		if (
			!isset(
				$requirements[
					$owner_id
				]
			)
		) {

			$requirements[
				$owner_id
			] = [
				'product' =>
					$product,

				'quantity' =>
					0.0,
			];
		}

		$requirements[
			$owner_id
		]['quantity'] +=
			$quantity;
	}

	foreach (
		$requirements
		as $requirement
	) {

		$available =
			pepti_ss_get_eu_stock(
				$requirement[
					'product'
				]
			);

		if (
			(float)
			$requirement[
				'quantity'
			]
			>
			$available
			+ 0.00001
		) {
			return true;
		}
	}

	return false;
}


/* ==========================================================================
 * ORDER HELPERS
 * ========================================================================== */

function pepti_ss_shipping_abbreviation(
	$order
) {

	$carrier =
		(string)
		$order->get_meta(
			PEPTI_SS_META_CARRIER,
			true
		);

	if (
		trim($carrier)
		=== ''
	) {

		$methods =
			$order->get_shipping_methods();

		if ($methods) {

			$first =
				reset($methods);

			if ($first) {

				$carrier =
					(string) (
						$first
							->get_method_title()
						?:
						$first
							->get_name()
					);
			}
		}
	}

	$value =
		strtolower(
			trim(
				$carrier
			)
		);

	if ($value === '') {
		return '—';
	}

	$map = [
		'royal mail' =>
			'RM',

		'parcelforce' =>
			'PF',

		'dpd' =>
			'DPD',

		'dhl' =>
			'DHL',

		'ups' =>
			'UPS',

		'fedex' =>
			'FEDEX',

		'evri' =>
			'EVRI',

		'yodel' =>
			'YODEL',

		'usps' =>
			'USPS',

		'gls' =>
			'GLS',

		'tnt' =>
			'TNT',

		'hermes' =>
			'EVRI',

		'international' =>
			'INTL',

		'courier' =>
			'COURIER',

		'collection' =>
			'COLLECT',

		'pickup' =>
			'PICKUP',
	];

	foreach (
		$map
		as $needle =>
		$abbreviation
	) {

		if (
			strpos(
				$value,
				$needle
			)
			!== false
		) {
			return $abbreviation;
		}
	}

	$value =
		preg_replace(
			'~[^a-z0-9]+~',
			' ',
			$value
		);

	$words =
		array_filter(
			explode(
				' ',
				$value
			)
		);

	$abbreviation =
		strtoupper(
			substr(
				implode(
					'',
					array_map(
						static function(
							$word
						) {

							return $word[0]
								?? '';
						},
						$words
					)
				),
				0,
				6
			)
		);

	return $abbreviation
		?: strtoupper(
			substr(
				$value,
				0,
				6
			)
		);
}


function pepti_ss_order_items_brief(
	$order,
	$max = 3
) {

	$parts =
		[];

	foreach (
		$order->get_items(
			'line_item'
		)
		as $item
	) {

		$quantity =
			(float)
			$item->get_quantity();

		$label =
			wp_strip_all_tags(
				$item->get_name()
			);

		$parts[] =
			rtrim(
				rtrim(
					number_format(
						$quantity,
						2,
						'.',
						''
					),
					'0'
				),
				'.'
			)
			. '× '
			. $label;
	}

	if (!$parts) {
		return 'No items';
	}

	$brief =
		implode(
			', ',
			array_slice(
				$parts,
				0,
				max(
					1,
					(int) $max
				)
			)
		);

	$extra =
		count($parts)
		- max(
			1,
			(int) $max
		);

	if ($extra > 0) {

		$brief .=
			' + '
			. $extra
			. ' more';
	}

	return $brief;
}


/* ==========================================================================
 * NOTES
 * ========================================================================== */

function pepti_ss_allowed_note_roles() {

	$roles =
		array_filter(
			array_map(
				'trim',
				explode(
					',',
					(string)
					PEPTI_SS_NOTE_ROLES
				)
			)
		);

	return $roles
		?: [
			'administrator',
			'shop_manager',
		];
}


function pepti_ss_user_allowed_note_role(
	$user_id
) {

	$user =
		get_user_by(
			'id',
			absint($user_id)
		);

	if (
		!$user
		|| !is_array(
			$user->roles
		)
	) {
		return false;
	}

	$allowed =
		pepti_ss_allowed_note_roles();

	foreach (
		$user->roles
		as $role
	) {

		if (
			in_array(
				$role,
				$allowed,
				true
			)
		) {
			return true;
		}
	}

	return false;
}


function pepti_ss_is_royalmail_autonote(
	$text,
	$tracking = ''
) {

	$text =
		strtolower(
			trim(
				(string) $text
			)
		);

	if ($text === '') {
		return false;
	}

	$looks_like =
		strpos(
			$text,
			'your order has been dispatched'
		)
		!== false

		|| strpos(
			$text,
			'royalmail.com/portal/rm/track'
		)
		!== false

		|| strpos(
			$text,
			'tracked 24'
		)
		!== false

		|| strpos(
			$text,
			'tracked24'
		)
		!== false;

	if (!$looks_like) {
		return false;
	}

	$normal_tracking =
		pepti_ss_normalise_tracking(
			$tracking
		);

	if ($normal_tracking !== '') {

		$normal_text =
			pepti_ss_normalise_tracking(
				$text
			);

		if (
			strpos(
				$normal_text,
				$normal_tracking
			)
			!== false
		) {
			return true;
		}
	}

	return true;
}


function pepti_ss_resolve_note_user(
	$comment_id,
	$fallback_email = ''
) {

	$comment_id =
		absint($comment_id);

	if ($comment_id > 0) {

		$user_id =
			absint(
				get_comment_meta(
					$comment_id,
					'added_by_user_id',
					true
				)
			);

		if ($user_id > 0) {
			return $user_id;
		}

		$user_id =
			absint(
				get_comment_meta(
					$comment_id,
					'_added_by_user_id',
					true
				)
			);

		if ($user_id > 0) {
			return $user_id;
		}

		$comment =
			get_comment(
				$comment_id
			);

		if (
			$comment
			&& !empty(
				$comment
					->comment_author_email
			)
		) {

			$user =
				get_user_by(
					'email',
					$comment
						->comment_author_email
				);

			if ($user) {
				return (int)
					$user->ID;
			}
		}
	}

	$fallback_email =
		trim(
			(string) $fallback_email
		);

	if ($fallback_email !== '') {

		$user =
			get_user_by(
				'email',
				$fallback_email
			);

		if ($user) {
			return (int)
				$user->ID;
		}
	}

	return 0;
}


function pepti_ss_relevant_notes(
	$order,
	$limit = 30
) {

	$limit =
		min(
			max(
				1,
				(int) $limit
			),
			60
		);

	$output =
		[];

	$order_id =
		$order->get_id();

	$tracking =
		(string)
		$order->get_meta(
			PEPTI_SS_META_TRACKING_NUM,
			true
		);

	$customer_note =
		trim(
			wp_strip_all_tags(
				(string)
				$order
					->get_customer_note()
			)
		);

	if (
		$customer_note !== ''
		&& !pepti_ss_is_royalmail_autonote(
			$customer_note,
			$tracking
		)
	) {

		$output[] = [
			'type' =>
				'customer',

			'who' =>
				'Customer',

			'when' =>
				'',

			'text' =>
				$customer_note,
		];
	}

	if (
		function_exists(
			'wc_get_order_notes'
		)
	) {

		try {

			$notes =
				wc_get_order_notes(
					[
						'order_id' =>
							$order_id,

						'orderby' =>
							'date_created',

						'order' =>
							'DESC',

						'limit' =>
							$limit,
					]
				);

			foreach (
				(array) $notes
				as $note
			) {

				$content =
					trim(
						wp_strip_all_tags(
							(string) (
								$note->content
								?? ''
							)
						)
					);

				if ($content === '') {
					continue;
				}

				$note_id =
					absint(
						$note->id
						?? 0
					);

				if (
					!empty(
						$note
							->customer_note
					)
				) {

					if (
						pepti_ss_is_royalmail_autonote(
							$content,
							$tracking
						)
					) {
						continue;
					}

					if (
						$content
						!== $customer_note
					) {

						$timestamp =
							0;

						try {

							$timestamp =
								$note->date_created
									? (int)
										$note
											->date_created
											->getTimestamp()
									: 0;

						} catch (
							Throwable $error
						) {}

						$output[] = [
							'type' =>
								'customer',

							'who' =>
								'Customer',

							'when' =>
								$timestamp
									? date_i18n(
										'd/m/Y H:i',
										$timestamp
									)
									: '',

							'text' =>
								$content,
						];
					}

					continue;
				}

				$added_by =
					strtolower(
						trim(
							(string) (
								$note->added_by
								?? ''
							)
						)
					);

				if (
					in_array(
						$added_by,
						[
							'woocommerce',
							'system',
						],
						true
					)
				) {
					continue;
				}

				$user_id =
					absint(
						$note
							->added_by_user_id
						?? 0
					);

				if ($user_id <= 0) {

					$user_id =
						pepti_ss_resolve_note_user(
							$note_id,
							(string) (
								$note->added_by
								?? ''
							)
						);
				}

				if (
					$user_id <= 0
					|| !pepti_ss_user_allowed_note_role(
						$user_id
					)
				) {
					continue;
				}

				$user =
					get_user_by(
						'id',
						$user_id
					);

				$who =
					$user
						? (
							$user->display_name
							?: $user->user_login
						)
						: 'Staff';

				$timestamp =
					0;

				try {

					$timestamp =
						$note->date_created
							? (int)
								$note
									->date_created
									->getTimestamp()
							: 0;

				} catch (
					Throwable $error
				) {}

				$output[] = [
					'type' =>
						'staff',

					'who' =>
						$who,

					'when' =>
						$timestamp
							? date_i18n(
								'd/m/Y H:i',
								$timestamp
							)
							: '',

					'text' =>
						$content,
				];
			}

		} catch (
			Throwable $error
		) {}
	}

	return $output;
}


function pepti_ss_notes_blob(
	array $notes
) {

	if (!$notes) {
		return '';
	}

	$lines =
		[];

	foreach (
		$notes
		as $note
	) {

		$type =
			(
				$note['type']
				?? ''
			)
			=== 'staff'
				? 'Staff note'
				: 'Customer note';

		$who =
			trim(
				(string) (
					$note['who']
					?? ''
				)
			);

		$when =
			trim(
				(string) (
					$note['when']
					?? ''
				)
			);

		$text =
			trim(
				(string) (
					$note['text']
					?? ''
				)
			);

		$header =
			$type;

		if ($who !== '') {
			$header .=
				' — '
				. $who;
		}

		if ($when !== '') {
			$header .=
				' — '
				. $when;
		}

		$lines[] =
			$header
			. "\n"
			. $text;
	}

	return trim(
		implode(
			"\n\n—\n\n",
			$lines
		)
	);
}


function pepti_ss_order_has_notes(
	$order
) {

	return !empty(
		pepti_ss_relevant_notes(
			$order,
			15
		)
	);
}


/* ==========================================================================
 * EMAIL LOG HELPERS
 * ========================================================================== */

function pepti_ss_mail_log_table() {

	global $wpdb;

	return $wpdb->prefix
		. 'pepti_mail_log';
}


function pepti_ss_mail_log_exists() {

	global $wpdb;

	$table =
		pepti_ss_mail_log_table();

	$found =
		$wpdb->get_var(
			$wpdb->prepare(
				'SHOW TABLES LIKE %s',
				$table
			)
		);

	return $found
		=== $table;
}


function pepti_ss_email_result_from_rows(
	$rows,
	$type = 'new'
) {

	$output = [
		'class' =>
			'none',

		'ticks' =>
			'—',

		'label' =>
			$type === 'completed'
				? 'No shipped/completed email status found yet'
				: 'No customer new order email status found yet',

		'status' =>
			'',

		'updated' =>
			'',
	];

	if (
		!is_array($rows)
		|| !$rows
	) {
		return $output;
	}

	$best_rank =
		0;

	$best_status =
		'';

	$best_reason =
		'';

	$best_updated =
		'';

	foreach (
		$rows
		as $row
	) {

		$status =
			strtolower(
				trim(
					(string) (
						$row['status']
						?? ''
					)
				)
			);

		$opened =
			(int) (
				$row['opened_count']
				?? 0
			);

		$clicked =
			(int) (
				$row['clicked_count']
				?? 0
			);

		$reason =
			trim(
				(string) (
					$row['failure_reason']
					?? ''
				)
			);

		$rank =
			0;

		if (
			in_array(
				$status,
				[
					'queued',
					'attempted',
				],
				true
			)
		) {
			$rank =
				1;
		}

		if (
			in_array(
				$status,
				[
					'sent',
					'request',
					'deferred',
				],
				true
			)
		) {
			$rank =
				2;
		}

		if (
			$status
			=== 'delivered'
		) {
			$rank =
				3;
		}

		if (
			in_array(
				$status,
				[
					'opened',
					'open',
					'unique_proxy_open',
					'clicked',
					'click',
				],
				true
			)
			|| $opened > 0
			|| $clicked > 0
		) {
			$rank =
				4;
		}

		if (
			in_array(
				$status,
				[
					'clicked',
					'click',
				],
				true
			)
			|| $clicked > 0
		) {
			$rank =
				5;
		}

		if (
			in_array(
				$status,
				[
					'failed',
					'error',
					'hard_bounce',
					'soft_bounce',
					'blocked',
					'invalid',
					'spam',
				],
				true
			)
		) {
			$rank =
				99;
		}

		if (
			$rank
			>= $best_rank
		) {

			$best_rank =
				$rank;

			$best_status =
				$status;

			$best_reason =
				$reason;

			$best_updated =
				(string) (
					$row['last_event_at']
					?? $row['updated_at']
					?? $row['created_at']
					?? ''
				);
		}
	}

	$output['status'] =
		$best_status;

	$output['updated'] =
		$best_updated;

	if ($best_rank === 99) {

		$output['class'] =
			'failed';

		$output['ticks'] =
			'Failed';

		$output['label'] =
			$type === 'completed'
				? 'Shipped/completed email failed'
				: 'Customer new order email failed';

		if ($best_reason !== '') {

			$output['label'] .=
				' — '
				. $best_reason;
		}

		return $output;
	}

	if ($best_rank >= 4) {

		$output['class'] =
			'read';

		$output['ticks'] =
			'✓✓';

		$output['label'] =
			$type === 'completed'
				? 'Shipped/completed email opened/read'
				: 'Customer new order email opened/read';

		return $output;
	}

	if ($best_rank === 3) {

		$output['class'] =
			'delivered';

		$output['ticks'] =
			'✓';

		$output['label'] =
			$type === 'completed'
				? 'Shipped/completed email delivered'
				: 'Customer new order email delivered';

		return $output;
	}

	if ($best_rank >= 1) {

		$output['class'] =
			'sent';

		$output['ticks'] =
			'•';

		$output['label'] =
			$type === 'completed'
				? 'Shipped/completed email sent'
				: 'Customer new order email sent';

		return $output;
	}

	return $output;
}


function pepti_ss_email_status(
	$order,
	$type = 'new'
) {

	global $wpdb;

	$empty =
		pepti_ss_email_result_from_rows(
			[],
			$type
		);

	if (
		!$order
		instanceof WC_Order
		|| !pepti_ss_mail_log_exists()
	) {
		return $empty;
	}

	$order_id =
		$order->get_id();

	$modified =
		$order->get_date_modified();

	$modified_ts =
		$modified
			? (int)
				$modified->getTimestamp()
			: 0;

	$cache_key =
		'pepti_ss_mail_'
		. sanitize_key($type)
		. '_'
		. $order_id
		. '_'
		. $modified_ts;

	$cached =
		get_transient(
			$cache_key
		);

	if (
		is_array($cached)
	) {
		return $cached;
	}

	$table =
		pepti_ss_mail_log_table();

	$order_number =
		trim(
			(string)
			$order
				->get_order_number()
		);

	$email =
		strtolower(
			trim(
				(string)
				$order
					->get_billing_email()
			)
		);

	if (
		$order_number === ''
		|| $email === ''
	) {
		return $empty;
	}

	$like_email =
		'%'
		. $wpdb->esc_like(
			$email
		)
		. '%';

	$like_order_hash =
		'%'
		. $wpdb->esc_like(
			'#'
			. $order_number
		)
		. '%';

	$like_order_plain =
		'%'
		. $wpdb->esc_like(
			$order_number
		)
		. '%';

	if ($type === 'completed') {

		$patterns = [
			'completed',
			'shipped',
			'posted',
			'dispatched',
			'dispatch',
			'tracking',
			'customer_completed_order',
		];

	} else {

		$patterns = [
			'order has been received',
			'has been received',
			'processing',
			'new order',
		];
	}

	$clauses =
		[];

	$arguments =
		[];

	foreach (
		$patterns
		as $pattern
	) {

		$like =
			'%'
			. $wpdb->esc_like(
				$pattern
			)
			. '%';

		$clauses[] =
			'subject LIKE %s';

		$arguments[] =
			$like;

		$clauses[] =
			'message_preview LIKE %s';

		$arguments[] =
			$like;

		$clauses[] =
			'source LIKE %s';

		$arguments[] =
			$like;
	}

	$sql =
		"
		SELECT
			id,
			status,
			opened_count,
			clicked_count,
			updated_at,
			last_event_at,
			subject,
			message_preview,
			provider,
			source,
			failure_reason,
			created_at

		FROM {$table}

		WHERE to_email LIKE %s

		AND (
			subject LIKE %s
			OR subject LIKE %s
			OR message_preview LIKE %s
			OR message_preview LIKE %s
		)

		AND (
			"
			. implode(
				' OR ',
				$clauses
			)
			. "
		)

		ORDER BY created_at DESC

		LIMIT 30
		";

	$params =
		array_merge(
			[
				$like_email,
				$like_order_hash,
				$like_order_plain,
				$like_order_hash,
				$like_order_plain,
			],
			$arguments
		);

	$rows =
		$wpdb->get_results(
			$wpdb->prepare(
				$sql,
				...$params
			),
			ARRAY_A
		);

	$result =
		pepti_ss_email_result_from_rows(
			$rows,
			$type
		);

	set_transient(
		$cache_key,
		$result,
		max(
			30,
			(int)
			PEPTI_SS_EMAIL_CACHE_SECONDS
		)
	);

	return $result;
}


function pepti_ss_email_badge(
	$order,
	$type = 'new'
) {

	$status =
		pepti_ss_email_status(
			$order,
			$type
		);

	return sprintf(
		'<span class="emailStatus %s" title="%s">%s</span>',
		esc_attr(
			sanitize_html_class(
				$status['class']
				?? 'none'
			)
		),
		esc_attr(
			$status['label']
				?? ''
		),
		esc_html(
			$status['ticks']
				?? '—'
		)
	);
}


/* ==========================================================================
 * ORDER QUERY HELPERS
 * ========================================================================== */

function pepti_ss_eu_meta_query() {

	return [
		[
			'key' =>
				PEPTI_SS_META_WAREHOUSE,

			'value' =>
				PEPTI_SS_WAREHOUSE,

			'compare' =>
				'=',
		],
	];
}


function pepti_ss_get_orders(
	array $args
) {

	$existing_meta =
		isset(
			$args['meta_query']
		)
		&& is_array(
			$args['meta_query']
		)
			? $args[
				'meta_query'
			]
			: [];

	$args['meta_query'] =
		array_merge(
			pepti_ss_eu_meta_query(),
			$existing_meta
		);

	return wc_get_orders(
		$args
	);
}


/* ==========================================================================
 * LOGIN
 * ========================================================================== */

function pepti_ss_render_login(
	$error = ''
) {

	$logo =
		esc_url(
			PEPTI_SS_LOGO
		);

	$brand =
		esc_html(
			PEPTI_SS_BRAND_NAME
		);

	status_header(200);

	?>
	<!doctype html>
	<html lang="en">
	<head>
		<meta charset="utf-8">
		<meta
			name="viewport"
			content="width=device-width,initial-scale=1"
		>
		<meta
			name="robots"
			content="noindex,nofollow"
		>

		<title>
			Shipping Señorita 👩🏻‍💼 – Login
		</title>

		<style>
			:root{
				--ss-bg:#ffffff;
				--ss-surface:#f8fafc;
				--ss-text:#0f172a;
				--ss-muted:#64748b;
				--ss-border:#e5e7eb;
				--ss-accent:#0ea5e9;
				--ss-bad:#991b1b;
				--ss-bad-soft:#fee2e2;
				--ss-bad-border:#fecaca;
			}

			html[data-theme="dark"]{
				--ss-bg:#07111f;
				--ss-surface:#0f1b2d;
				--ss-text:#edf4ff;
				--ss-muted:#a6b6ca;
				--ss-border:#2c4058;
				--ss-accent:#38bdf8;
				--ss-bad:#fb7185;
				--ss-bad-soft:rgba(244,63,94,.12);
				--ss-bad-border:rgba(251,113,133,.42);
			}

			header,
			.site-header,
			.elementor-location-header,
			.page-title,
			.breadcrumbs,
			footer,
			.site-footer,
			.elementor-location-footer,
			#wpadminbar{
				display:none !important;
			}

			html,
			body{
				height:100%;
				margin:0;
				background:var(--ss-bg);
				color:var(--ss-text);
				font:16px/1.45 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,system-ui,sans-serif;
			}

			.wrap{
				max-width:440px;
				margin:12vh auto;
				padding:0 16px;
			}

			.brand{
				display:flex;
				align-items:center;
				gap:12px;
				margin-bottom:12px;
			}

			.brand img{
				height:42px;
			}

			h1{
				margin:0;
				font-size:26px;
				font-weight:900;
			}

			.sub{
				font-size:12px;
				color:var(--ss-muted);
				margin-top:3px;
			}

			.card{
				border:1px solid var(--ss-border);
				border-radius:14px;
				background:var(--ss-surface);
				padding:16px;
			}

			form{
				display:flex;
				gap:8px;
			}

			input[type=password]{
				flex:1;
				min-width:0;
				border:1px solid var(--ss-border);
				border-radius:9px;
				padding:11px;
				background:var(--ss-bg);
				color:var(--ss-text);
			}

			button{
				border:1px solid var(--ss-accent);
				background:var(--ss-accent);
				color:#fff;
				border-radius:9px;
				padding:10px 14px;
				cursor:pointer;
				font-weight:800;
			}

			.hint{
				font-size:12px;
				color:var(--ss-muted);
				margin-top:10px;
			}

			.err{
				background:var(--ss-bad-soft);
				border:1px solid var(--ss-bad-border);
				color:var(--ss-bad);
				padding:8px 10px;
				border-radius:8px;
				margin-bottom:10px;
			}
		</style>

		<script>
		(function(){
			try{
				const saved =
					localStorage.getItem(
						'pepti_shipping_senorita_theme'
					);

				if(saved === 'dark'){
					document.documentElement
						.setAttribute(
							'data-theme',
							'dark'
						);
				}
			}catch(error){}
		})();
		</script>
	</head>

	<body>

	<div class="wrap">

		<div class="brand">

			<?php if ($logo): ?>

				<img
					src="<?php echo esc_url($logo); ?>"
					alt="<?php echo esc_attr($brand); ?>"
				>

			<?php endif; ?>


			<div>
				<h1>
					Shipping Señorita 👩🏻‍💼
				</h1>

				<div class="sub">
					Europe Warehouse Dispatch
				</div>
			</div>

		</div>


		<div class="card">

			<?php if ($error): ?>

				<div class="err">
					<?php echo esc_html($error); ?>
				</div>

			<?php endif; ?>


			<form
				method="post"
				action="<?php echo esc_url(pepti_ss_plain_url()); ?>"
			>

				<input
					type="password"
					name="pepti_ss_password"
					placeholder="Password"
					autocomplete="off"
					autofocus
				>

				<button type="submit">
					Login
				</button>

			</form>


			<div class="hint">
				Dedicated Europe Warehouse dispatch access.
			</div>

		</div>

	</div>

	</body>
	</html>

	<?php

	exit;
}


/* ==========================================================================
 * ROUTER / API
 * ========================================================================== */

add_action(
	'init',
	function() {

		if (
			!isset(
				$_GET[
					'shipping_senorita'
				]
			)
		) {
			return;
		}

		nocache_headers();

		header(
			'Cache-Control: no-store, no-cache, must-revalidate, max-age=0'
		);

		header(
			'Pragma: no-cache'
		);

		header(
			'Expires: 0'
		);


		/* ------------------------------------------------------------------
		 * LOGOUT
		 * ---------------------------------------------------------------- */

		if (
			isset(
				$_GET['ss_action']
			)
			&& sanitize_key(
				$_GET['ss_action']
			)
			=== 'logout'
		) {

			$token =
				isset(
					$_GET[
						'ss_session'
					]
				)
					? sanitize_text_field(
						wp_unslash(
							$_GET[
								'ss_session'
							]
						)
					)
					: '';

			if ($token !== '') {

				pepti_ss_session_destroy(
					$token
				);
			}

			wp_safe_redirect(
				pepti_ss_plain_url()
			);

			exit;
		}


		/* ------------------------------------------------------------------
		 * PRINT
		 * ---------------------------------------------------------------- */

		if (
			isset(
				$_GET['do']
			)
			&& sanitize_key(
				$_GET['do']
			)
			=== 'print'
		) {

			header(
				'Content-Type: application/json; charset=UTF-8'
			);

			$session =
				isset(
					$_GET[
						'ss_session'
					]
				)
					? sanitize_text_field(
						wp_unslash(
							$_GET[
								'ss_session'
							]
						)
					)
					: '';

			if (
				!pepti_ss_session_get(
					$session
				)
				&& !current_user_can(
					'edit_shop_orders'
				)
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'denied',
					]
				);

				exit;
			}

			$order_id =
				absint(
					$_GET['oid']
					?? 0
				);

			$expires =
				(int) (
					$_GET['ts']
					?? 0
				);

			$signature =
				sanitize_text_field(
					wp_unslash(
						$_GET['sig']
						?? ''
					)
				);

			if (
				!$order_id
				|| !$expires
				|| $signature === ''
				|| !pepti_ss_check_action(
					'print',
					$order_id,
					$expires,
					$signature
				)
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'bad_signature',
					]
				);

				exit;
			}

			$order =
				wc_get_order(
					$order_id
				);

			if (
				!$order
				instanceof WC_Order
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'not_found',
					]
				);

				exit;
			}

			if (
				!pepti_ss_is_europe_order(
					$order
				)
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'wrong_warehouse',
					]
				);

				exit;
			}

			if (
				function_exists(
					'le_printer_send_html'
				)
			) {

				$success =
					(bool)
					le_printer_send_html(
						$order
					);

				if ($success) {

					$order->update_meta_data(
						PEPTI_SS_META_PRINTER_SENT_AT,
						time()
					);

					$order->update_meta_data(
						PEPTI_SS_META_PRINTER_LAST,
						'ok'
					);

					$order->save();

					$order->add_order_note(
						'Printer HTML email sent from Shipping Señorita.'
					);

					echo wp_json_encode(
						[
							'ok' =>
								true,

							'message' =>
								'Sent to printer',
						]
					);

					exit;
				}

				$order->update_meta_data(
					PEPTI_SS_META_PRINTER_LAST,
					'fail'
				);

				$order->save();

				$order->add_order_note(
					'Printer HTML email FAILED from Shipping Señorita.'
				);

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'send_failed',
					]
				);

				exit;
			}

			echo wp_json_encode(
				[
					'ok' =>
						false,

					'error' =>
						'printer_helper_missing',
				]
			);

			exit;
		}


		/* ------------------------------------------------------------------
		 * UPDATE TRACKING
		 * ---------------------------------------------------------------- */

		if (
			isset(
				$_GET['do']
			)
			&& sanitize_key(
				$_GET['do']
			)
			=== 'update_tracking'
		) {

			header(
				'Content-Type: application/json; charset=UTF-8'
			);

			$session =
				isset(
					$_GET[
						'ss_session'
					]
				)
					? sanitize_text_field(
						wp_unslash(
							$_GET[
								'ss_session'
							]
						)
					)
					: '';

			if (
				!pepti_ss_session_get(
					$session
				)
				&& !current_user_can(
					'edit_shop_orders'
				)
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'denied',
					]
				);

				exit;
			}

			$order_id =
				absint(
					$_GET['oid']
					?? 0
				);

			$expires =
				(int) (
					$_GET['ts']
					?? 0
				);

			$signature =
				sanitize_text_field(
					wp_unslash(
						$_GET['sig']
						?? ''
					)
				);

			if (
				!$order_id
				|| !$expires
				|| $signature === ''
				|| !pepti_ss_check_action(
					'tracking',
					$order_id,
					$expires,
					$signature
				)
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'bad_signature',
					]
				);

				exit;
			}

			$order =
				wc_get_order(
					$order_id
				);

			if (
				!$order
				instanceof WC_Order
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'not_found',
					]
				);

				exit;
			}

			if (
				!pepti_ss_is_europe_order(
					$order
				)
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'wrong_warehouse',
					]
				);

				exit;
			}

			if (
				!$order->has_status(
					'processing'
				)
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'not_processing',
					]
				);

				exit;
			}

			$tracking =
				(string) (
					$_REQUEST[
						'tracking'
					]
					?? ''
				);

			$tracking =
				wp_strip_all_tags(
					$tracking
				);

			$tracking =
				preg_replace(
					'/[\x00-\x1F\x7F\x{200B}\x{200C}\x{200D}\x{FEFF}]+/u',
					'',
					$tracking
				);

			$tracking =
				trim(
					$tracking
				);

			if ($tracking === '') {

				$order->delete_meta_data(
					PEPTI_SS_META_TRACKING_NUM
				);

				$order->delete_meta_data(
					PEPTI_SS_META_TRACKING_URL
				);

				$order->save();

				echo wp_json_encode(
					[
						'ok' =>
							true,

						'order_id' =>
							$order_id,

						'tracking' =>
							'',

						'cleared' =>
							true,
					]
				);

				exit;
			}

			$order->update_meta_data(
				PEPTI_SS_META_TRACKING_NUM,
				$tracking
			);

			if (
				function_exists(
					'le_build_tracking_url'
				)
			) {

				$carrier =
					(string)
					$order->get_meta(
						PEPTI_SS_META_CARRIER,
						true
					);

				if ($carrier !== '') {

					$url =
						le_build_tracking_url(
							$carrier,
							$tracking
						);

					if ($url) {

						$order->update_meta_data(
							PEPTI_SS_META_TRACKING_URL,
							esc_url_raw(
								$url
							)
						);
					}
				}
			}

			$order->save();

			echo wp_json_encode(
				[
					'ok' =>
						true,

					'order_id' =>
						$order_id,

					'tracking' =>
						$tracking,

					'tracking_norm' =>
						pepti_ss_normalise_tracking(
							$tracking
						),

					'cleared' =>
						false,
				]
			);

			exit;
		}


		/* ------------------------------------------------------------------
		 * TRACKING BARCODE SCAN
		 * ---------------------------------------------------------------- */

		if (
			isset(
				$_GET['do']
			)
			&& sanitize_key(
				$_GET['do']
			)
			=== 'scan_dispatch'
		) {

			header(
				'Content-Type: application/json; charset=UTF-8'
			);

			$session =
				isset(
					$_GET[
						'ss_session'
					]
				)
					? sanitize_text_field(
						wp_unslash(
							$_GET[
								'ss_session'
							]
						)
					)
					: '';

			if (
				!pepti_ss_session_get(
					$session
				)
				&& !current_user_can(
					'edit_shop_orders'
				)
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'denied',
					]
				);

				exit;
			}

			$tracking_raw =
				trim(
					sanitize_text_field(
						wp_unslash(
							$_GET[
								'tracking'
							]
							?? ''
						)
					)
				);

			$tracking_norm =
				pepti_ss_normalise_tracking(
					$tracking_raw
				);

			if ($tracking_norm === '') {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'empty',
					]
				);

				exit;
			}

			$like_a =
				$tracking_raw;

			$like_b =
				preg_replace(
					'~\s+~',
					'',
					$tracking_raw
				);

			$candidates =
				pepti_ss_get_orders(
					[
						'limit' =>
							60,

						'return' =>
							'objects',

						'orderby' =>
							'date',

						'order' =>
							'DESC',

						'status' =>
							[
								'processing',
								'on-hold',
								'completed',
								'pending',
								'failed',
								'cancelled',
								'refunded',
							],

						'meta_query' =>
							[
								'relation' =>
									'OR',

								[
									'key' =>
										PEPTI_SS_META_TRACKING_NUM,

									'value' =>
										$like_a,

									'compare' =>
										'LIKE',
								],

								[
									'key' =>
										PEPTI_SS_META_TRACKING_NUM,

									'value' =>
										$like_b,

									'compare' =>
										'LIKE',
								],
							],
					]
				);

			$matches =
				[];

			foreach (
				(array) $candidates
				as $candidate
			) {

				if (
					!$candidate
					instanceof WC_Order
					|| !pepti_ss_is_europe_order(
						$candidate
					)
				) {
					continue;
				}

				$stored =
					(string)
					$candidate->get_meta(
						PEPTI_SS_META_TRACKING_NUM,
						true
					);

				if (
					pepti_ss_normalise_tracking(
						$stored
					)
					=== $tracking_norm
				) {

					$matches[] =
						$candidate;
				}
			}

			if (!$matches) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'not_found',

						'tracking' =>
							$tracking_raw,
					]
				);

				exit;
			}

			$chosen =
				null;

			foreach (
				$matches
				as $candidate
			) {

				if (
					$candidate->has_status(
						[
							'processing',
							'on-hold',
						]
					)
				) {

					$chosen =
						$candidate;

					break;
				}
			}

			if (!$chosen) {

				$chosen =
					reset(
						$matches
					);
			}

			if (
				!$chosen
				instanceof WC_Order
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'not_found',
					]
				);

				exit;
			}

			/*
			 * Second authoritative guard.
			 */
			if (
				!pepti_ss_is_europe_order(
					$chosen
				)
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'wrong_warehouse',
					]
				);

				exit;
			}

			$chosen->update_meta_data(
				PEPTI_SS_META_SCANNED_AT,
				time()
			);

			$chosen->save();

			$dispatch_url =
				'';

			$json_complete =
				false;

			if (
				function_exists(
					'le_make_signed_scan_url'
				)
			) {

				$scan_url =
					le_make_signed_scan_url(
						$chosen
					);

				if ($scan_url) {

					$dispatch_url =
						add_query_arg(
							[
								'le_complete_json' =>
									1,
							],
							$scan_url
						);

					$json_complete =
						true;
				}
			}

			echo wp_json_encode(
				[
					'ok' =>
						true,

					'number' =>
						$chosen
							->get_order_number(),

					'order_id' =>
						$chosen
							->get_id(),

					'tracking' =>
						$tracking_raw,

					'warehouse' =>
						PEPTI_SS_WAREHOUSE,

					'dispatch_url' =>
						$dispatch_url,

					'json_complete' =>
						$json_complete,
				]
			);

			exit;
		}


		/* ------------------------------------------------------------------
		 * POLL ORDER
		 * ---------------------------------------------------------------- */

		if (
			isset(
				$_GET['do']
			)
			&& sanitize_key(
				$_GET['do']
			)
			=== 'poll_order'
		) {

			header(
				'Content-Type: application/json; charset=UTF-8'
			);

			$session =
				isset(
					$_GET[
						'ss_session'
					]
				)
					? sanitize_text_field(
						wp_unslash(
							$_GET[
								'ss_session'
							]
						)
					)
					: '';

			if (
				!pepti_ss_session_get(
					$session
				)
				&& !current_user_can(
					'edit_shop_orders'
				)
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'denied',
					]
				);

				exit;
			}

			$order_id =
				absint(
					$_GET['oid']
					?? 0
				);

			$order =
				$order_id
					? wc_get_order(
						$order_id
					)
					: false;

			if (
				!$order
				instanceof WC_Order
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'not_found',
					]
				);

				exit;
			}

			if (
				!pepti_ss_is_europe_order(
					$order
				)
			) {

				echo wp_json_encode(
					[
						'ok' =>
							false,

						'error' =>
							'wrong_warehouse',
					]
				);

				exit;
			}

			echo wp_json_encode(
				[
					'ok' =>
						true,

					'status' =>
						$order
							->get_status(),

					'qr_used' =>
						(int)
						$order->get_meta(
							PEPTI_SS_META_QR_USED,
							true
						),

					'tracking' =>
						(string)
						$order->get_meta(
							PEPTI_SS_META_TRACKING_NUM,
							true
						),
				]
			);

			exit;
		}


		/* ------------------------------------------------------------------
		 * LOGIN SUBMISSION
		 * ---------------------------------------------------------------- */

		if (
			!empty(
				$_POST[
					'pepti_ss_password'
				]
			)
		) {

			$password =
				(string)
				wp_unslash(
					$_POST[
						'pepti_ss_password'
					]
				);

			if (
				hash_equals(
					(string)
					PEPTI_SS_PASSWORD,
					$password
				)
			) {

				$token =
					pepti_ss_session_create();

				wp_safe_redirect(
					pepti_ss_url_with_session(
						$token
					)
				);

				exit;
			}

			pepti_ss_render_login(
				'Incorrect password. Try again.'
			);

			exit;
		}


		/* ------------------------------------------------------------------
		 * PAGE OUTPUT
		 * ---------------------------------------------------------------- */

		add_action(
			'template_redirect',
			function() {

				add_action(
					'wp_head',
					function() {

						echo
							'<meta name="robots" content="noindex,nofollow">';
					},
					1
				);

				$session_token =
					null;

				if (
					!pepti_ss_has_access(
						$session_token
					)
				) {

					pepti_ss_render_login();

					exit;
				}

				$timezone =
					wp_timezone();

				$start =
					(
						new DateTimeImmutable(
							'today',
							$timezone
						)
					)->setTime(
						0,
						0,
						0
					);

				$end =
					$start->modify(
						'+1 day'
					);


				/* ----------------------------------------------------------
				 * PROCESSING EU
				 * --------------------------------------------------------- */

				$processing_all =
					pepti_ss_get_orders(
						[
							'status' =>
								[
									'processing',
								],

							'limit' =>
								PEPTI_SS_MAX_ROWS,

							'orderby' =>
								'date',

							'order' =>
								'DESC',

							'return' =>
								'objects',
						]
					);


				/* ----------------------------------------------------------
				 * EU BACKORDER CANDIDATES
				 * --------------------------------------------------------- */

				$backorder_candidates =
					pepti_ss_get_orders(
						[
							'status' =>
								[
									'processing',
									'on-hold',
								],

							'limit' =>
								PEPTI_SS_MAX_ROWS,

							'orderby' =>
								'date',

							'order' =>
								'DESC',

							'return' =>
								'objects',
						]
					);

				$backorders =
					[];

				foreach (
					$backorder_candidates
					as $order
				) {

					if (
						pepti_ss_order_has_backorder(
							$order
						)
					) {

						$backorders[] =
							$order;
					}
				}

				$backorder_ids =
					[];

				foreach (
					$backorders
					as $order
				) {

					$backorder_ids[
						$order->get_id()
					] =
						true;
				}

				$processing_non_backorder =
					[];

				foreach (
					$processing_all
					as $order
				) {

					if (
						empty(
							$backorder_ids[
								$order->get_id()
							]
						)
					) {

						$processing_non_backorder[] =
							$order;
					}
				}


				/* ----------------------------------------------------------
				 * COMPLETED TODAY EU
				 * --------------------------------------------------------- */

				$completed_today =
					pepti_ss_get_orders(
						[
							'status' =>
								[
									'completed',
								],

							'date_completed' =>
								$start->format(
									'Y-m-d H:i:s'
								)
								. '...'
								. $end->format(
									'Y-m-d H:i:s'
								),

							'limit' =>
								PEPTI_SS_MAX_ROWS,

							'orderby' =>
								'date_completed',

							'order' =>
								'DESC',

							'return' =>
								'objects',
						]
					);


				/* ----------------------------------------------------------
				 * NOTES
				 * --------------------------------------------------------- */

				$notes_orders =
					[];

				foreach (
					$backorder_candidates
					as $order
				) {

					if (
						pepti_ss_order_has_notes(
							$order
						)
					) {

						$notes_orders[] =
							$order;
					}
				}


				$kpi_ship =
					count(
						$processing_non_backorder
					);

				$kpi_backorder =
					count(
						$backorders
					);

				$kpi_completed =
					count(
						$completed_today
					);

				$kpi_notes =
					count(
						$notes_orders
					);


				/* ----------------------------------------------------------
				 * ITEMS MODAL
				 * --------------------------------------------------------- */

				$build_items_html =
					static function(
						$order,
						$qr_url = ''
					) {

						$shipping_methods =
							$order
								->get_shipping_methods();

						$shipping_label =
							'—';

						if (
							!empty(
								$shipping_methods
							)
						) {

							$first =
								reset(
									$shipping_methods
								);

							if ($first) {

								$shipping_label =
									(
										$first
											->get_method_title()
										?:
										$first
											->get_name()
									)
									?: '—';
							}
						}

						$address =
							trim(
								(string)
								$order
									->get_formatted_shipping_address()
							);

						if ($address === '') {

							$address =
								trim(
									(string)
									$order
										->get_formatted_billing_address()
								);
						}

						$address_html =
							$address !== ''
								? nl2br(
									esc_html(
										$address
									)
								)
								: '<span class="muted">—</span>';

						$rows =
							'';

						foreach (
							$order->get_items(
								'line_item'
							)
							as $item
						) {

							$quantity =
								(float)
								$item
									->get_quantity();

							$name =
								wp_strip_all_tags(
									(string)
									$item
										->get_name()
								);

							$product =
								$item
									->get_product();

							$image =
								'';

							if (
								$product
								instanceof WC_Product
								&& $product
									->exists()
							) {

								$image_id =
									(int)
									$product
										->get_image_id();

								if ($image_id) {

									$source =
										wp_get_attachment_image_src(
											$image_id,
											'thumbnail'
										);

									if (
										!empty(
											$source[0]
										)
									) {

										$image =
											esc_url(
												$source[0]
											);
									}
								}
							}

							if (
								$image === ''
								&& function_exists(
									'wc_placeholder_img_src'
								)
							) {

								$image =
									esc_url(
										wc_placeholder_img_src(
											'thumbnail'
										)
									);
							}

							$quantity_text =
								rtrim(
									rtrim(
										number_format(
											$quantity,
											2,
											'.',
											''
										),
										'0'
									),
									'.'
								);

							$eu_stock =
								$product
								instanceof WC_Product
									? pepti_ss_get_eu_stock(
										$product
									)
									: 0;

							$rows .=
								'<div class="itrow">'
								. '<div class="itimg">'
								. '<img src="'
								. $image
								. '" alt="'
								. esc_attr(
									$name
								)
								. '" loading="lazy">'
								. '</div>'

								. '<div class="itmeta">'
								. '<div class="itname">'
								. esc_html(
									$name
								)
								. '</div>'

								. '<div class="itqty">'
								. 'Qty: <strong>'
								. esc_html(
									$quantity_text
								)
								. '</strong>'
								. '</div>'

								. '<div class="itstock">'
								. 'EU stock: <strong>'
								. esc_html(
									rtrim(
										rtrim(
											number_format(
												$eu_stock,
												2,
												'.',
												''
											),
											'0'
										),
										'.'
									)
								)
								. '</strong>'
								. '</div>'

								. '</div>'
								. '</div>';
						}

						if ($rows === '') {

							$rows =
								'<div class="muted">'
								. 'No items'
								. '</div>';
						}

						$qr_block =
							'';

						if ($qr_url !== '') {

							$qr_block =
								'<div class="qrblock">'
								. '<div class="sectt">'
								. 'Scan to dispatch'
								. '</div>'

								. '<img class="qrimg" src="'
								. esc_url(
									$qr_url
								)
								. '" alt="Dispatch QR" loading="lazy">'

								. '<div class="qrs">'
								. 'Europe Warehouse order'
								. '</div>'
								. '</div>';
						}

						return
							'<div class="orderpop">'

							. '<div class="topgrid">'

							. '<div class="sect">'
							. '<div class="sectt">'
							. 'Warehouse'
							. '</div>'
							. '<div class="sectv">'
							. esc_html(
								PEPTI_SS_WAREHOUSE_NAME
							)
							. '</div>'
							. '</div>'

							. '<div class="sect">'
							. '<div class="sectt">'
							. 'Shipping'
							. '</div>'
							. '<div class="sectv">'
							. esc_html(
								$shipping_label
							)
							. '</div>'
							. '</div>'

							. '<div class="sect">'
							. '<div class="sectt">'
							. 'Address'
							. '</div>'
							. '<div class="sectv addr">'
							. $address_html
							. '</div>'
							. '</div>'

							. $qr_block

							. '</div>'

							. '<div class="sectt" style="margin-top:12px;">'
							. 'Items'
							. '</div>'

							. '<div class="itemsgrid">'
							. $rows
							. '</div>'

							. '</div>';
					};


				/* ----------------------------------------------------------
				 * ROW
				 * --------------------------------------------------------- */

				$render_row =
					static function(
						$order,
						$kind
					) use (
						$session_token,
						$build_items_html
					) {

						if (
							!pepti_ss_is_europe_order(
								$order
							)
						) {
							return '';
						}

						$order_id =
							$order
								->get_id();

						$order_number =
							esc_html(
								$order
									->get_order_number()
							);

						$name_raw =
							trim(
								$order
									->get_formatted_shipping_full_name()
							)
							?:
							trim(
								$order
									->get_formatted_billing_full_name()
							);

						$name =
							$name_raw !== ''
								? esc_html(
									$name_raw
								)
								: '—';

						$country =
							esc_html(
								pepti_ss_order_country(
									$order
								)
							);

						$ship =
							esc_html(
								pepti_ss_shipping_abbreviation(
									$order
								)
							);

						$qr_url =
							'';

						$scan_url =
							'';

						if (
							function_exists(
								'le_make_signed_scan_url'
							)
						) {

							$scan_url =
								(string)
								le_make_signed_scan_url(
									$order
								);

							if (
								$scan_url !== ''
								&& function_exists(
									'le_get_qr_proxy_url'
								)
							) {

								$qr_url =
									(string)
									le_get_qr_proxy_url(
										$scan_url,
										260
									);
							}
						}

						$items_html =
							$build_items_html(
								$order,
								$qr_url
							);

						$brief =
							pepti_ss_order_items_brief(
								$order
							);

						$print_token =
							pepti_ss_sign_action(
								'print',
								$order_id,
								600
							);

						$print_url =
							add_query_arg(
								[
									'shipping_senorita' =>
										1,

									'do' =>
										'print',

									'oid' =>
										$order_id,

									'ts' =>
										$print_token[
											'ts'
										],

									'sig' =>
										$print_token[
											'sig'
										],

									'ss_session' =>
										$session_token,
								],
								home_url('/')
							);

						$tracking =
							(string)
							$order->get_meta(
								PEPTI_SS_META_TRACKING_NUM,
								true
							);

						$tracking_led =
							$tracking !== ''
								? '<span class="led on" title="Tracking on file"></span>'
								: '<span class="led" title="No tracking"></span>';

						$tracking_text =
							$tracking !== ''
								? esc_html(
									$tracking
								)
								: '<span class="muted">—</span>';

						$has_backorder =
							pepti_ss_order_has_backorder(
								$order
							);

						$backorder_led =
							$has_backorder
								? '<span class="led bo on" title="EU warehouse shortfall"></span>'
								: '<span class="led bo" title="EU warehouse stock sufficient"></span>';

						$notes =
							pepti_ss_relevant_notes(
								$order,
								30
							);

						$notes_blob =
							pepti_ss_notes_blob(
								$notes
							);

						$note_button =
							$notes_blob !== ''
								? '<button class="btn note" title="Notes">NOTE</button>'
								: '';

						if (
							$kind
							=== 'completed'
						) {

							$date =
								$order
									->get_date_completed()
								?:
								$order
									->get_date_created();

							$status_label =
								'Completed';

							$email_badge =
								pepti_ss_email_badge(
									$order,
									'completed'
								);

						} elseif (
							$kind
							=== 'backorder'
						) {

							$date =
								$order
									->get_date_created();

							$status_label =
								'EU Backorder';

							$email_badge =
								'<span class="muted">—</span>';

						} else {

							$date =
								$order
									->get_date_created();

							$status_label =
								'Processing';

							$email_badge =
								pepti_ss_email_badge(
									$order,
									'new'
								);
						}

						$time =
							$date
								? esc_html(
									$date->date_i18n(
										'd/m H:i'
									)
								)
								: '';

						$sort_timestamp =
							$date
								? (int)
									$date
										->getTimestamp()
								: 0;

						$tracking_edit_button =
							'';

						$tracking_ts =
							'';

						$tracking_sig =
							'';

						if (
							$order->has_status(
								'processing'
							)
						) {

							$tracking_token =
								pepti_ss_sign_action(
									'tracking',
									$order_id,
									600
								);

							$tracking_ts =
								$tracking_token[
									'ts'
								];

							$tracking_sig =
								$tracking_token[
									'sig'
								];

							$tracking_edit_button =
								'<button class="trkedit" type="button" title="Edit tracking">'
								. '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">'
								. '<path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zm2.92 2.33H5v-.92l9.06-9.06.92.92L5.92 19.58zM20.71 7.04a1.003 1.003 0 000-1.42l-2.34-2.34a1.003 1.003 0 00-1.42 0l-1.83 1.83 3.75 3.75 1.84-1.82z"/>'
								. '</svg>'
								. '</button>';
						}

						$stock_deducted =
							$order->get_meta(
								PEPTI_SS_META_STOCK_DEDUCTED,
								true
							)
							=== 'yes';

						$stock_badge =
							$stock_deducted
								? '<span class="stockState good">EU deducted</span>'
								: '<span class="stockState warning">Awaiting deduction</span>';

						return
							'<tr class="r"'

							. ' data-kind="'
							. esc_attr(
								$kind
							)
							. '"'

							. ' data-sort-time="'
							. esc_attr(
								(string)
								$sort_timestamp
							)
							. '"'

							. ' data-oid="'
							. absint(
								$order_id
							)
							. '"'

							. ' data-qr="'
							. esc_attr(
								$qr_url
							)
							. '"'

							. ' data-scan="'
							. esc_url(
								$scan_url
							)
							. '"'

							. ' data-print="'
							. esc_url(
								$print_url
							)
							. '"'

							. ' data-items="'
							. esc_attr(
								$items_html
							)
							. '"'

							. ' data-cust="'
							. esc_attr(
								$name_raw
							)
							. '"'

							. ' data-brief="'
							. esc_attr(
								$brief
							)
							. '"'

							. ' data-notes="'
							. esc_attr(
								$notes_blob
							)
							. '"'

							. ' data-trk="'
							. esc_attr(
								$tracking
							)
							. '"'

							. ' data-trkts="'
							. esc_attr(
								(string)
								$tracking_ts
							)
							. '"'

							. ' data-trksig="'
							. esc_attr(
								(string)
								$tracking_sig
							)
							. '">'

							. '<td class="ord">'
							. '<a href="#" class="ordlink">'
							. '#'
							. $order_number
							. '</a>'
							. '</td>'

							. '<td class="cust">'
							. $name
							. '</td>'

							. '<td class="country">'
							. $country
							. '</td>'

							. '<td class="warehouse">'
							. '<span class="warehouseBadge">'
							. 'EU'
							. '</span>'
							. '</td>'

							. '<td class="ship">'
							. $ship
							. '</td>'

							. '<td class="tracking">'
							. $tracking_led
							. ' <span class="trk">'
							. $tracking_text
							. '</span>'
							. $tracking_edit_button
							. '</td>'

							. '<td class="backo">'
							. $backorder_led
							. '</td>'

							. '<td class="notes">'
							. $note_button
							. '</td>'

							. '<td class="st">'
							. esc_html(
								$status_label
							)
							. '</td>'

							. '<td class="stock">'
							. $stock_badge
							. '</td>'

							. '<td class="email">'
							. $email_badge
							. '</td>'

							. '<td class="tm">'
							. $time
							. '</td>'

							. '<td class="act">'

							. '<button class="btn qr" title="View dispatch QR">'
							. '<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">'
							. '<rect x="3" y="3" width="6" height="6"/>'
							. '<rect x="15" y="3" width="6" height="6"/>'
							. '<rect x="3" y="15" width="6" height="6"/>'
							. '<rect x="11" y="11" width="4" height="4"/>'
							. '</svg>'
							. '</button>'

							. '<button class="btn print" title="Send to printer">'
							. '<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">'
							. '<path d="M6 9V2h12v7H6zm12 2h2a2 2 0 012 2v5h-4v4H6v-4H2v-5a2 2 0 012-2h2v3h12v-3z"/>'
							. '</svg>'
							. '</button>'

							. '</td>'

							. '</tr>';
					};


				/* ----------------------------------------------------------
				 * BUILD ROWS
				 * --------------------------------------------------------- */

				$rows_html =
					'';

				foreach (
					$processing_non_backorder
					as $order
				) {

					$rows_html .=
						$render_row(
							$order,
							'ship'
						);
				}

				foreach (
					$backorders
					as $order
				) {

					$rows_html .=
						$render_row(
							$order,
							'backorder'
						);
				}

				foreach (
					$completed_today
					as $order
				) {

					$rows_html .=
						$render_row(
							$order,
							'completed'
						);
				}


				$logout_url =
					add_query_arg(
						[
							'shipping_senorita' =>
								1,

							'ss_action' =>
								'logout',

							'ss_session' =>
								$session_token,
						],
						home_url('/')
					);

				$logo =
					esc_url(
						PEPTI_SS_LOGO
					);

				$brand =
					esc_html(
						PEPTI_SS_BRAND_NAME
					);

				status_header(200);

				?>

<!DOCTYPE html>
<html lang="en">

<head>

<meta charset="utf-8">

<meta
	name="viewport"
	content="width=device-width,initial-scale=1"
>

<meta
	name="robots"
	content="noindex,nofollow"
>

<title>
	Shipping Señorita 👩🏻‍💼
</title>


<style>

:root{
	--ss-bg:#ffffff;
	--ss-surface:#ffffff;
	--ss-soft:#f8fafc;
	--ss-hover:#f1f5f9;
	--ss-input:#ffffff;

	--ss-text:#0f172a;
	--ss-text-soft:#334155;
	--ss-muted:#64748b;
	--ss-faint:#94a3b8;

	--ss-border:#e5e7eb;
	--ss-border-soft:#f1f5f9;

	--ss-accent:#0ea5e9;
	--ss-accent-soft:#e0f2fe;
	--ss-accent-border:#38bdf8;

	--ss-good:#15803d;
	--ss-good-soft:#ecfdf5;
	--ss-good-border:#86efac;

	--ss-warn:#b45309;
	--ss-warn-soft:#fff7ed;
	--ss-warn-border:#fdba74;

	--ss-bad:#b91c1c;
	--ss-bad-soft:#fef2f2;
	--ss-bad-border:#fca5a5;

	--ss-blue:#1d4ed8;
	--ss-blue-soft:#eff6ff;
	--ss-blue-border:#93c5fd;

	--ss-eu:#4338ca;
	--ss-eu-soft:#eef2ff;
	--ss-eu-border:#a5b4fc;

	--ss-toast-ok:#14532d;
	--ss-toast-err:#7f1d1d;
}


html[data-theme="dark"]{
	--ss-bg:#07111f;
	--ss-surface:#0f1b2d;
	--ss-soft:#111e31;
	--ss-hover:#18273d;
	--ss-input:#101e31;

	--ss-text:#edf4ff;
	--ss-text-soft:#d5e0ee;
	--ss-muted:#a6b6ca;
	--ss-faint:#7e90a7;

	--ss-border:#2c4058;
	--ss-border-soft:#203148;

	--ss-accent:#38bdf8;
	--ss-accent-soft:rgba(56,189,248,.13);
	--ss-accent-border:#38bdf8;

	--ss-good:#4ade80;
	--ss-good-soft:rgba(34,197,94,.12);
	--ss-good-border:rgba(74,222,128,.42);

	--ss-warn:#fbbf24;
	--ss-warn-soft:rgba(245,158,11,.12);
	--ss-warn-border:rgba(251,191,36,.42);

	--ss-bad:#fb7185;
	--ss-bad-soft:rgba(244,63,94,.12);
	--ss-bad-border:rgba(251,113,133,.42);

	--ss-blue:#60a5fa;
	--ss-blue-soft:rgba(59,130,246,.14);
	--ss-blue-border:rgba(96,165,250,.42);

	--ss-eu:#a5b4fc;
	--ss-eu-soft:rgba(99,102,241,.14);
	--ss-eu-border:rgba(165,180,252,.42);
}


header,
.site-header,
.elementor-location-header,
.page-title,
.breadcrumbs,
footer,
.site-footer,
.elementor-location-footer,
#wpadminbar{
	display:none !important;
}


html,
body{
	height:100%;
	margin:0;

	background:
		var(--ss-bg);

	color:
		var(--ss-text);

	font:
		16px/1.45
		-apple-system,
		BlinkMacSystemFont,
		"SF Pro Text",
		"Segoe UI",
		Roboto,
		system-ui,
		sans-serif;
}


*{
	box-sizing:border-box;
}


.shell{
	min-height:100%;
	display:flex;
	flex-direction:column;
}


/* =========================================================
 * HEADER
 * ======================================================= */

.head{
	display:flex;
	align-items:center;
	justify-content:space-between;

	gap:16px;

	padding:
		18px
		20px;

	border-bottom:
		1px solid
		var(--ss-border);

	background:
		var(--ss-soft);
}


.brand{
	display:flex;
	align-items:center;

	gap:14px;

	min-width:0;
}


.brand img{
	height:52px;
}


.brand h1{
	margin:0;

	font-size:24px;

	font-weight:900;

	white-space:nowrap;

	color:
		var(--ss-text);
}


.brand .sub{
	margin-top:2px;

	font-size:12px;

	color:
		var(--ss-muted);
}


.warehouseHead{
	display:inline-flex;
	align-items:center;

	gap:7px;

	margin-top:7px;

	padding:
		5px
		9px;

	border:
		1px solid
		var(--ss-eu-border);

	border-radius:999px;

	background:
		var(--ss-eu-soft);

	color:
		var(--ss-eu);

	font-size:11px;

	font-weight:900;
}


.clockwrap{
	display:flex;
	align-items:center;

	gap:12px;
}


.clock{
	font-weight:700;

	color:
		var(--ss-text-soft);
}


.logout a{
	font-size:12px;

	color:
		var(--ss-accent);

	text-decoration:none;

	font-weight:800;
}


.themeToggle{
	appearance:none;

	border:
		1px solid
		var(--ss-border);

	background:
		var(--ss-surface);

	color:
		var(--ss-text);

	border-radius:999px;

	padding:
		8px
		14px;

	font-weight:800;

	font-size:12px;

	cursor:pointer;

	display:inline-flex;

	align-items:center;

	gap:6px;
}


.themeToggle:hover{
	border-color:
		var(--ss-accent-border);

	background:
		var(--ss-accent-soft);

	color:
		var(--ss-accent);
}


.main{
	padding:
		16px
		20px
		26px;

	flex:1;
}


/* =========================================================
 * KPIS
 * ======================================================= */

.kpis{
	display:grid;

	grid-template-columns:
		repeat(
			4,
			minmax(0,1fr)
		);

	gap:14px;

	margin-bottom:14px;
}


.kpi{
	position:relative;

	border:
		1px solid
		var(--ss-border);

	border-radius:14px;

	padding:
		16px
		18px;

	background:
		var(--ss-surface);

	cursor:pointer;

	user-select:none;
}


.kpi h3{
	margin:
		0
		0
		6px;

	font-size:12px;

	text-transform:uppercase;

	letter-spacing:.04em;

	color:
		var(--ss-muted);
}


.kpi .n{
	font-size:40px;

	font-weight:900;

	line-height:1;

	color:
		var(--ss-text);
}


.kpi.active{
	outline:
		3px solid
		var(--ss-accent-soft);

	border-color:
		var(--ss-accent);
}


.kpi.orange{
	background:
		linear-gradient(
			135deg,
			var(--ss-warn-soft),
			transparent 88%
		),
		var(--ss-surface);

	border-color:
		var(--ss-warn-border);
}


.kpi.orange .n{
	color:
		var(--ss-warn);
}


.kpi.red{
	background:
		linear-gradient(
			135deg,
			var(--ss-bad-soft),
			transparent 88%
		),
		var(--ss-surface);

	border-color:
		var(--ss-bad-border);
}


.kpi.red .n{
	color:
		var(--ss-bad);
}


.kpi.green{
	background:
		linear-gradient(
			135deg,
			var(--ss-good-soft),
			transparent 88%
		),
		var(--ss-surface);

	border-color:
		var(--ss-good-border);
}


.kpi.green .n{
	color:
		var(--ss-good);
}


.kpi.blue{
	background:
		linear-gradient(
			135deg,
			var(--ss-blue-soft),
			transparent 88%
		),
		var(--ss-surface);

	border-color:
		var(--ss-blue-border);
}


.kpi.blue .n{
	color:
		var(--ss-blue);
}


/* =========================================================
 * TOOLBAR
 * ======================================================= */

.toolbar{
	display:flex;

	gap:10px;

	align-items:center;

	margin-bottom:12px;

	flex-wrap:wrap;
}


.toolbar input{
	flex:1;

	min-width:280px;

	border:
		1px solid
		var(--ss-border);

	border-radius:10px;

	padding:12px;

	background:
		var(--ss-input);

	color:
		var(--ss-text);

	font-size:14px;
}


.toolbar input:focus{
	outline:none;

	border-color:
		var(--ss-accent);

	box-shadow:
		0 0 0 3px
		var(--ss-accent-soft);
}


.toolbar .pill{
	border:
		1px solid
		var(--ss-border);

	border-radius:999px;

	padding:
		8px
		12px;

	background:
		var(--ss-surface);

	color:
		var(--ss-text);

	font-weight:800;

	font-size:12px;
}


.sortToggle{
	appearance:none;

	border:
		1px solid
		var(--ss-border);

	background:
		var(--ss-surface);

	color:
		var(--ss-text);

	border-radius:999px;

	padding:
		10px
		14px;

	font-weight:900;

	font-size:12px;

	cursor:pointer;
}


.sortToggle:hover{
	background:
		var(--ss-hover);
}


.sortToggle.active{
	border-color:
		var(--ss-accent-border);

	background:
		var(--ss-accent-soft);

	color:
		var(--ss-accent);
}


/* =========================================================
 * TABLE
 * ======================================================= */

.card{
	border:
		1px solid
		var(--ss-border);

	border-radius:14px;

	overflow:hidden;

	background:
		var(--ss-surface);

	display:flex;

	flex-direction:column;
}


.card h2{
	margin:0;

	padding:
		12px
		14px;

	font-size:14px;

	font-weight:900;

	background:
		var(--ss-soft);

	border-bottom:
		1px solid
		var(--ss-border);

	color:
		var(--ss-text);
}


.card .body{
	flex:1;

	min-height:180px;

	overflow:auto;
}


table{
	width:100%;

	min-width:1220px;

	border-collapse:collapse;
}


th,
td{
	padding:
		12px
		10px;

	border-bottom:
		1px solid
		var(--ss-border-soft);

	vertical-align:middle;
}


th{
	font-size:11px;

	text-transform:uppercase;

	letter-spacing:.04em;

	color:
		var(--ss-muted);

	text-align:left;

	background:
		var(--ss-soft);
}


td{
	color:
		var(--ss-text-soft);
}


tr.r:hover td{
	background:
		var(--ss-hover);
}


td.ord{
	width:110px;

	font-weight:800;
}


td.cust{
	width:19%;
}


td.country{
	width:13%;
}


td.warehouse{
	width:90px;
}


td.ship{
	width:74px;

	white-space:nowrap;
}


td.tracking{
	width:205px;
}


td.backo{
	width:88px;

	text-align:center;
}


td.notes{
	width:86px;
}


td.st{
	width:110px;
}


td.stock{
	width:130px;
}


td.email{
	width:85px;

	text-align:center;
}


td.tm{
	width:115px;

	white-space:nowrap;
}


td.act{
	width:130px;
}


body:not(.pepti-ss-show-email)
td.email,

body:not(.pepti-ss-show-email)
th.emailHead{
	display:none !important;
}


.warehouseBadge{
	display:inline-flex;

	align-items:center;

	justify-content:center;

	min-width:42px;

	padding:
		5px
		9px;

	border:
		1px solid
		var(--ss-eu-border);

	border-radius:999px;

	background:
		var(--ss-eu-soft);

	color:
		var(--ss-eu);

	font-size:10px;

	font-weight:950;
}


.stockState{
	display:inline-flex;

	padding:
		4px
		7px;

	border-radius:999px;

	font-size:10px;

	font-weight:900;

	white-space:nowrap;
}


.stockState.good{
	color:
		var(--ss-good);

	background:
		var(--ss-good-soft);

	border:
		1px solid
		var(--ss-good-border);
}


.stockState.warning{
	color:
		var(--ss-warn);

	background:
		var(--ss-warn-soft);

	border:
		1px solid
		var(--ss-warn-border);
}


.led{
	display:inline-block;

	width:10px;
	height:10px;

	border-radius:50%;

	background:
		var(--ss-faint);

	margin-right:8px;

	border:
		1px solid
		var(--ss-muted);

	vertical-align:middle;
}


.led.on{
	background:
		var(--ss-good);

	border-color:
		var(--ss-good);

	box-shadow:
		0 0 0 2px
		var(--ss-good-soft);
}


.led.bo{
	background:
		var(--ss-good-soft);

	border-color:
		var(--ss-good-border);

	box-shadow:none;

	margin-right:0;
}


.led.bo.on{
	background:
		var(--ss-bad);

	border-color:
		var(--ss-bad);

	box-shadow:
		0 0 0 2px
		var(--ss-bad-soft);
}


.emailStatus{
	display:inline-flex;

	align-items:center;

	justify-content:center;

	min-width:38px;

	height:24px;

	padding:
		0
		9px;

	border-radius:999px;

	border:
		1px solid
		var(--ss-border);

	background:
		var(--ss-soft);

	color:
		var(--ss-muted);

	font-size:11px;

	font-weight:950;
}


.emailStatus.sent{
	background:
		var(--ss-blue-soft);

	border-color:
		var(--ss-blue-border);

	color:
		var(--ss-blue);
}


.emailStatus.delivered{
	background:
		var(--ss-good-soft);

	border-color:
		var(--ss-good-border);

	color:
		var(--ss-good);
}


.emailStatus.read{
	background:
		var(--ss-blue-soft);

	border-color:
		var(--ss-blue-border);

	color:
		var(--ss-blue);
}


.emailStatus.failed{
	background:
		var(--ss-bad-soft);

	border-color:
		var(--ss-bad-border);

	color:
		var(--ss-bad);

	min-width:58px;
}


.emailStatus.none{
	background:
		var(--ss-soft);

	border-color:
		var(--ss-border);

	color:
		var(--ss-faint);
}


.btn{
	appearance:none;

	border:
		1px solid
		var(--ss-border);

	background:
		var(--ss-surface);

	border-radius:10px;

	padding:8px;

	cursor:pointer;

	margin-right:8px;

	display:inline-flex;

	align-items:center;

	justify-content:center;

	font-weight:800;

	color:
		var(--ss-text);
}


.btn:hover{
	background:
		var(--ss-hover);
}


.btn.note{
	border-color:
		var(--ss-warn-border);

	background:
		var(--ss-warn-soft);

	color:
		var(--ss-warn);
}


.ord a.ordlink{
	color:
		var(--ss-text);

	text-decoration:none;

	border-bottom:
		1px dotted
		var(--ss-faint);
}


.ord a.ordlink:hover{
	color:
		var(--ss-accent);

	border-bottom-color:
		var(--ss-accent);
}


.trkedit{
	appearance:none;

	border:
		1px solid
		var(--ss-border);

	background:
		var(--ss-surface);

	border-radius:10px;

	padding:6px;

	cursor:pointer;

	margin-left:8px;

	display:inline-flex;

	align-items:center;

	justify-content:center;

	vertical-align:middle;

	color:
		var(--ss-text-soft);
}


.trkedit:hover{
	background:
		var(--ss-hover);
}


/* =========================================================
 * MODAL
 * ======================================================= */

.modal{
	position:fixed;

	inset:0;

	background:
		rgba(
			2,
			8,
			18,
			.80
		);

	display:none;

	align-items:center;

	justify-content:center;

	padding:20px;

	z-index:2147483647;
}


.modal .box{
	position:relative;

	background:
		var(--ss-surface);

	border:
		1px solid
		var(--ss-border);

	border-radius:16px;

	padding:
		16px
		16px
		12px;

	max-width:94vw;

	color:
		var(--ss-text);

	box-shadow:
		0 26px 70px
		rgba(
			0,
			0,
			0,
			.45
		);
}


.modal .content{
	max-width:86vw;

	max-height:74vh;

	overflow:auto;
}


.modal .foot{
	margin-top:8px;

	text-align:center;

	color:
		var(--ss-muted);

	font-size:12px;
}


.modal .close{
	position:absolute;

	top:8px;
	right:8px;

	border:none;

	background:transparent;

	font-size:20px;

	cursor:pointer;

	color:
		var(--ss-muted);
}


.orderpop{
	max-width:86vw;
}


.topgrid{
	display:grid;

	grid-template-columns:
		repeat(
			4,
			minmax(0,1fr)
		);

	gap:12px;
}


.sect{
	border:
		1px solid
		var(--ss-border);

	border-radius:12px;

	background:
		var(--ss-surface);

	padding:
		10px
		12px;
}


.sectt{
	font-size:11px;

	text-transform:uppercase;

	letter-spacing:.06em;

	color:
		var(--ss-muted);

	margin-bottom:6px;

	font-weight:800;
}


.sectv{
	font-size:13px;

	color:
		var(--ss-text);

	font-weight:800;
}


.sectv.addr{
	line-height:1.35;
}


.qrblock{
	border:
		1px solid
		var(--ss-eu-border);

	border-radius:12px;

	background:
		var(--ss-eu-soft);

	padding:
		10px
		12px;

	display:flex;

	flex-direction:column;

	align-items:center;

	justify-content:center;
}


.qrimg{
	width:180px;

	height:180px;

	object-fit:contain;

	display:block;
}


.qrs{
	font-size:11px;

	color:
		var(--ss-muted);

	margin-top:6px;

	text-align:center;
}


.itemsgrid{
	margin-top:8px;

	display:grid;

	grid-template-columns:
		repeat(
			2,
			minmax(0,1fr)
		);

	gap:10px;
}


.itrow{
	display:flex;

	gap:10px;

	border:
		1px solid
		var(--ss-border);

	border-radius:12px;

	padding:10px;

	background:
		var(--ss-surface);
}


.itimg{
	width:62px;

	min-width:62px;

	height:62px;

	border-radius:10px;

	overflow:hidden;

	border:
		1px solid
		var(--ss-border);

	background:
		var(--ss-soft);

	display:flex;

	align-items:center;

	justify-content:center;
}


.itimg img{
	width:100%;

	height:100%;

	object-fit:cover;

	display:block;
}


.itmeta{
	min-width:0;
}


.itname{
	font-weight:900;

	color:
		var(--ss-text);

	font-size:13px;

	line-height:1.25;

	word-break:break-word;
}


.itqty,
.itstock{
	margin-top:6px;

	font-size:12px;

	color:
		var(--ss-text-soft);
}


.toast{
	position:fixed;

	right:16px;
	bottom:16px;

	background:
		var(--ss-toast-ok);

	color:#fff;

	padding:
		10px
		12px;

	border-radius:10px;

	opacity:0;

	transform:
		translateY(8px);

	transition:.2s;

	z-index:2147483647;
}


.toast.show{
	opacity:1;

	transform:none;
}


.muted{
	color:
		var(--ss-muted);
}


@media(max-width:1200px){

	.kpis{
		grid-template-columns:
			1fr 1fr;
	}

	.brand img{
		height:44px;
	}

	.kpi .n{
		font-size:34px;
	}
}


@media(max-width:980px){

	.topgrid{
		grid-template-columns:
			1fr 1fr;
	}

	.itemsgrid{
		grid-template-columns:
			1fr;
	}

	.qrimg{
		width:220px;
		height:220px;
	}
}


@media(max-width:760px){

	.kpis{
		grid-template-columns:
			1fr;
	}

	.head{
		flex-wrap:wrap;
	}

	.topgrid{
		grid-template-columns:
			1fr;
	}

	.brand h1{
		font-size:21px;
	}
}

</style>


<script>
(function(){

	try{

		const saved =
			localStorage.getItem(
				'pepti_shipping_senorita_theme'
			);

		if(saved === 'dark'){

			document.documentElement
				.setAttribute(
					'data-theme',
					'dark'
				);
		}

	}catch(error){}

})();
</script>

</head>


<body
	data-ss-session="<?php echo esc_attr((string) $session_token); ?>"
>


<script>
(function(){

	try{

		const url =
			new URL(
				location.href
			);

		const key =
			'pepti_ss_session_token';

		let token =
			url.searchParams.get(
				'ss_session'
			)
			|| '';

		if(
			!token
			&& document.body
			&& document.body.dataset
		){

			token =
				document.body
					.dataset
					.ssSession
				|| '';
		}

		if(token){

			sessionStorage.setItem(
				key,
				token
			);

		}else{

			const stored =
				sessionStorage.getItem(
					key
				)
				|| '';

			if(stored){

				url.searchParams.set(
					'ss_session',
					stored
				);

				history.replaceState(
					null,
					'',
					url.toString()
				);
			}
		}

	}catch(error){}

})();
</script>


<div class="shell">


	<div class="head">


		<div class="brand">

			<?php if ($logo): ?>

				<img
					src="<?php echo esc_url($logo); ?>"
					alt="<?php echo esc_attr($brand); ?>"
				>

			<?php endif; ?>


			<div>

				<h1>
					Shipping Señorita 👩🏻‍💼
				</h1>

				<div class="sub">
					Europe Warehouse Dispatch System
				</div>

				<div class="warehouseHead">
					🇪🇺 Europe Warehouse
				</div>

			</div>

		</div>


		<div class="clockwrap">

			<button
				type="button"
				class="themeToggle"
				id="ssThemeToggle"
			>
				<span id="ssThemeIcon">
					🌙
				</span>

				<span id="ssThemeLabel">
					Dark
				</span>
			</button>


			<div
				class="clock"
				id="ssClock"
			>
				—:—:—
			</div>


			<div class="logout">

				<a
					href="<?php echo esc_url($logout_url); ?>"
				>
					Logout
				</a>

			</div>

		</div>

	</div>


	<div class="main">


		<div class="kpis">


			<div
				class="kpi orange active"
				id="ssKpiShip"
				data-view="ship"
			>

				<h3>
					EU To Ship
				</h3>

				<div class="n">
					<?php echo (int) $kpi_ship; ?>
				</div>

			</div>


			<div
				class="kpi red"
				id="ssKpiBackorder"
				data-view="backorder"
			>

				<h3>
					EU Backorders
				</h3>

				<div class="n">
					<?php echo (int) $kpi_backorder; ?>
				</div>

			</div>


			<div
				class="kpi green"
				id="ssKpiCompleted"
				data-view="completed"
			>

				<h3>
					Completed Today
				</h3>

				<div class="n">
					<?php echo (int) $kpi_completed; ?>
				</div>

			</div>


			<div
				class="kpi blue"
				id="ssKpiNotes"
				data-view="notes"
			>

				<h3>
					Customer Notes
				</h3>

				<div class="n">
					<?php echo (int) $kpi_notes; ?>
				</div>

			</div>


		</div>


		<div class="toolbar">


			<input
				id="ssSearch"
				type="text"
				placeholder="Search EU orders — order #, customer, tracking, country…"
			>


			<button
				type="button"
				class="sortToggle"
				id="ssOldestFirst"
			>
				↑ Oldest first
			</button>


			<span
				class="pill"
				id="ssViewPill"
			>
				Viewing: EU To Ship
			</span>


			<span class="pill">
				Authoritative warehouse: EU
			</span>


		</div>


		<div class="card">


			<h2>
				Europe Warehouse Orders
			</h2>


			<div class="body">


				<table>


					<thead>

						<tr>

							<th>
								Order
							</th>

							<th>
								Customer
							</th>

							<th>
								Country
							</th>

							<th>
								Warehouse
							</th>

							<th>
								Ship
							</th>

							<th>
								Tracking
							</th>

							<th>
								Backorder
							</th>

							<th>
								Notes
							</th>

							<th>
								Status
							</th>

							<th>
								Stock
							</th>

							<th class="emailHead">
								Email
							</th>

							<th>
								Time
							</th>

							<th>
								Actions
							</th>

						</tr>

					</thead>


					<tbody id="ssTbody">

						<?php

						echo $rows_html
							?: '<tr><td colspan="13" style="padding:18px;color:var(--ss-muted);">No Europe Warehouse orders.</td></tr>';

						?>

					</tbody>


				</table>


			</div>


		</div>


	</div>


</div>


<div
	class="modal"
	id="ssModal"
	role="dialog"
	aria-modal="true"
>


	<div class="box">


		<button
			class="close"
			id="ssModalClose"
			aria-label="Close"
		>
			×
		</button>


		<div
			id="ssModalContent"
			class="content"
		></div>


		<div class="foot">
			Closes automatically in
			<span id="ssCountdown">
				10
			</span>s
		</div>


	</div>


</div>


<div
	class="toast"
	id="ssToast"
>
	…
</div>


<script>
(function(){

	'use strict';


	/* =====================================================
	 * THEME
	 * =================================================== */

	const themeButton =
		document.getElementById(
			'ssThemeToggle'
		);

	const themeIcon =
		document.getElementById(
			'ssThemeIcon'
		);

	const themeLabel =
		document.getElementById(
			'ssThemeLabel'
		);

	const THEME_KEY =
		'pepti_shipping_senorita_theme';


	function applyTheme(
		theme
	){

		if(theme === 'dark'){

			document.documentElement
				.setAttribute(
					'data-theme',
					'dark'
				);

			if(themeIcon){
				themeIcon.textContent =
					'☀️';
			}

			if(themeLabel){
				themeLabel.textContent =
					'Light';
			}

		}else{

			document.documentElement
				.removeAttribute(
					'data-theme'
				);

			if(themeIcon){
				themeIcon.textContent =
					'🌙';
			}

			if(themeLabel){
				themeLabel.textContent =
					'Dark';
			}
		}
	}


	try{

		const saved =
			localStorage.getItem(
				THEME_KEY
			);

		applyTheme(
			saved === 'dark'
				? 'dark'
				: 'light'
		);

	}catch(error){}


	if(themeButton){

		themeButton.addEventListener(
			'click',
			function(){

				const dark =
					document
						.documentElement
						.getAttribute(
							'data-theme'
						)
					=== 'dark';

				const next =
					dark
						? 'light'
						: 'dark';

				applyTheme(
					next
				);

				try{

					localStorage.setItem(
						THEME_KEY,
						next
					);

				}catch(error){}
			}
		);
	}


	/* =====================================================
	 * CLOCK
	 * =================================================== */

	const clock =
		document.getElementById(
			'ssClock'
		);


	function tickClock(){

		if(!clock){
			return;
		}

		const date =
			new Date();

		const pad =
			number =>
				String(number)
					.padStart(
						2,
						'0'
					);

		clock.textContent =
			date.toLocaleDateString(
				undefined,
				{
					weekday:
						'short',

					day:
						'2-digit',

					month:
						'short'
				}
			)
			+ ' '
			+ pad(
				date.getHours()
			)
			+ ':'
			+ pad(
				date.getMinutes()
			)
			+ ':'
			+ pad(
				date.getSeconds()
			);
	}


	tickClock();

	setInterval(
		tickClock,
		1000
	);


	/* =====================================================
	 * BOARD
	 * =================================================== */

	const modal =
		document.getElementById(
			'ssModal'
		);

	const modalContent =
		document.getElementById(
			'ssModalContent'
		);

	const modalClose =
		document.getElementById(
			'ssModalClose'
		);

	const countdown =
		document.getElementById(
			'ssCountdown'
		);

	const toast =
		document.getElementById(
			'ssToast'
		);

	const tbody =
		document.getElementById(
			'ssTbody'
		);

	const search =
		document.getElementById(
			'ssSearch'
		);

	const viewPill =
		document.getElementById(
			'ssViewPill'
		);

	const oldestButton =
		document.getElementById(
			'ssOldestFirst'
		);

	const OLDEST_KEY =
		'pepti_shipping_senorita_oldest_v1';


	let currentView =
		'ship';

	let oldestFirst =
		false;

	let closeTimer =
		null;

	let countdownTimer =
		null;

	let scanPollTimer =
		null;


	function escapeHtml(
		value
	){

		return String(
			value || ''
		).replace(
			/[&<>"']/g,
			function(character){

				return {
					'&':
						'&amp;',

					'<':
						'&lt;',

					'>':
						'&gt;',

					'"':
						'&quot;',

					"'":
						'&#39;'
				}[character];
			}
		);
	}


	function showToast(
		message,
		ok = true
	){

		if(!toast){
			return;
		}

		toast.textContent =
			message;

		toast.style.background =
			ok
				? 'var(--ss-toast-ok)'
				: 'var(--ss-toast-err)';

		toast.classList.add(
			'show'
		);

		setTimeout(
			function(){

				toast.classList.remove(
					'show'
				);

			},
			2400
		);
	}


	window.PeptiSSHasModalOpen =
		function(){

			return Boolean(
				modal
				&& modal.style.display
					=== 'flex'
			);
		};


	window.PeptiSSCloseModal =
		function(){

			if(modal){

				modal.style.display =
					'none';
			}

			if(modalContent){

				modalContent.innerHTML =
					'';
			}

			clearInterval(
				countdownTimer
			);

			clearTimeout(
				closeTimer
			);

			if(scanPollTimer){

				clearInterval(
					scanPollTimer
				);

				scanPollTimer =
					null;
			}
		};


	function openModal(
		html,
		duration = 10
	){

		if(
			!modal
			|| !modalContent
		){
			return;
		}

		modalContent.innerHTML =
			html
			|| '<div class="muted">No content</div>';

		modal.style.display =
			'flex';

		clearInterval(
			countdownTimer
		);

		clearTimeout(
			closeTimer
		);

		let remaining =
			Number(
				duration
			);

		if(remaining <= 0){

			if(countdown){
				countdown.textContent =
					'—';
			}

			return;
		}

		if(countdown){

			countdown.textContent =
				String(
					remaining
				);
		}

		countdownTimer =
			setInterval(
				function(){

					remaining--;

					if(countdown){

						countdown.textContent =
							String(
								Math.max(
									0,
									remaining
								)
							);
					}

					if(remaining <= 0){

						clearInterval(
							countdownTimer
						);
					}

				},
				1000
			);

		closeTimer =
			setTimeout(
				window.PeptiSSCloseModal,
				Math.max(
					0,
					remaining
				)
				* 1000
			);
	}


	if(modal){

		modal.addEventListener(
			'click',
			function(event){

				if(event.target === modal){

					window.PeptiSSCloseModal();
				}
			}
		);
	}


	if(modalClose){

		modalClose.addEventListener(
			'click',
			window.PeptiSSCloseModal
		);
	}


	function withSession(
		input
	){

		let url;

		try{

			url =
				input instanceof URL
					? new URL(
						input.href
					)
					: new URL(
						input,
						location.origin
					);

		}catch(error){

			url =
				new URL(
					location.href
				);
		}

		let token =
			'';

		try{

			token =
				new URLSearchParams(
					location.search
				).get(
					'ss_session'
				)
				||
				sessionStorage.getItem(
					'pepti_ss_session_token'
				)
				||
				(
					document.body
					&& document.body.dataset
						? document.body
							.dataset
							.ssSession
						: ''
				)
				|| '';

		}catch(error){}

		if(
			token
			&& !url.searchParams.get(
				'ss_session'
			)
		){

			url.searchParams.set(
				'ss_session',
				token
			);
		}

		url.searchParams.set(
			'_t',
			Date.now()
		);

		return url.toString();
	}


	/* =====================================================
	 * QR
	 * =================================================== */

	const QR_CACHE =
		new Map();


	function primeQr(
		url
	){

		if(
			!url
			|| QR_CACHE.has(
				url
			)
		){
			return;
		}

		const image =
			new Image();

		QR_CACHE.set(
			url,
			image
		);

		try{
			image.decoding =
				'async';
		}catch(error){}

		image.src =
			url;
	}


	function preloadVisibleQr(){

		if(!tbody){
			return;
		}

		const rows =
			Array.from(
				tbody.querySelectorAll(
					'tr.r'
				)
			)
			.filter(
				row =>
					row.style.display
					!== 'none'
			)
			.slice(
				0,
				160
			);

		rows.forEach(
			function(row){

				const qr =
					(
						row.getAttribute(
							'data-qr'
						)
						|| ''
					).trim();

				if(qr){
					primeQr(qr);
				}
			}
		);
	}


	/* =====================================================
	 * POLL
	 * =================================================== */

	function startScanPoll(
		orderId
	){

		if(!orderId){
			return;
		}

		if(scanPollTimer){

			clearInterval(
				scanPollTimer
			);
		}

		let tries =
			0;

		scanPollTimer =
			setInterval(
				async function(){

					tries++;

					if(tries > 60){

						clearInterval(
							scanPollTimer
						);

						scanPollTimer =
							null;

						showToast(
							'Timed out waiting for dispatch.',
							false
						);

						return;
					}

					try{

						const url =
							new URL(
								location.href
							);

						url.searchParams.set(
							'do',
							'poll_order'
						);

						url.searchParams.set(
							'oid',
							String(
								orderId
							)
						);

						const response =
							await fetch(
								withSession(
									url
								),
								{
									credentials:
										'same-origin'
								}
							);

						const json =
							await response
								.json()
								.catch(
									function(){
										return null;
									}
								);

						if(
							!json
							|| !json.ok
						){

							if(
								json
								&& json.error
									=== 'wrong_warehouse'
							){

								clearInterval(
									scanPollTimer
								);

								scanPollTimer =
									null;

								window.PeptiSSCloseModal();

								showToast(
									'Order is no longer assigned to Europe.',
									false
								);
							}

							return;
						}

						const status =
							json.status
							|| '';

						const qrUsed =
							parseInt(
								json.qr_used
								|| 0,
								10
							);

						const tracking =
							(
								json.tracking
								|| ''
							).trim();

						if(
							status === 'completed'
							&& (
								qrUsed > 0
								|| tracking
							)
						){

							clearInterval(
								scanPollTimer
							);

							scanPollTimer =
								null;

							window.PeptiSSCloseModal();

							showToast(
								'Europe order dispatched.',
								true
							);

							setTimeout(
								function(){

									const refresh =
										new URL(
											location.href
										);

									refresh.searchParams.set(
										'_r',
										Date.now()
									);

									location.replace(
										refresh.toString()
									);

								},
								800
							);
						}

					}catch(error){}
				},
				1000
			);
	}


	/* =====================================================
	 * QR BUTTON
	 * =================================================== */

	document.addEventListener(
		'click',
		function(event){

			const button =
				event.target.closest(
					'.btn.qr'
				);

			if(!button){
				return;
			}

			event.preventDefault();

			const row =
				button.closest(
					'tr.r'
				);

			if(!row){
				return;
			}

			const scan =
				(
					row.getAttribute(
						'data-scan'
					)
					|| ''
				).trim();

			const qr =
				(
					row.getAttribute(
						'data-qr'
					)
					|| ''
				).trim();

			const orderId =
				parseInt(
					row.getAttribute(
						'data-oid'
					)
					|| '0',
					10
				);

			const customer =
				row.getAttribute(
					'data-cust'
				)
				|| '';

			const brief =
				row.getAttribute(
					'data-brief'
				)
				|| '';

			const heading =
				(customer || brief)
					? '<div style="font-weight:900;margin-bottom:8px;text-align:center">'
						+ escapeHtml(
							customer
						)
						+ (
							customer
							&& brief
								? ' — '
								: ''
						)
						+ escapeHtml(
							brief
						)
						+ '</div>'
					: '';

			if(scan){

				const html =
					heading
					+ '<div style="margin-bottom:8px;text-align:center;font-size:12px;font-weight:900;color:var(--ss-eu);">'
					+ 'EUROPE WAREHOUSE'
					+ '</div>'
					+ '<div style="width:100%;max-width:520px;height:420px;max-height:70vh;">'
					+ '<iframe src="'
					+ escapeHtml(
						scan
					)
					+ '" style="width:100%;height:100%;border:1px solid var(--ss-border);border-radius:12px;" loading="lazy"></iframe>'
					+ '</div>';

				openModal(
					html,
					0
				);

				if(orderId){

					startScanPoll(
						orderId
					);
				}

				return;
			}

			if(!qr){

				showToast(
					'QR unavailable.',
					false
				);

				return;
			}

			openModal(
				heading
				+ '<div style="text-align:center;font-size:12px;font-weight:900;color:var(--ss-eu);margin-bottom:8px;">EUROPE WAREHOUSE</div>'
				+ '<img src="'
				+ escapeHtml(
					qr
				)
				+ '" alt="QR" style="display:block;width:300px;height:300px;object-fit:contain;margin:0 auto;">',
				10
			);
		}
	);


	/* =====================================================
	 * PRINT
	 * =================================================== */

	document.addEventListener(
		'click',
		async function(event){

			const button =
				event.target.closest(
					'.btn.print'
				);

			if(!button){
				return;
			}

			event.preventDefault();

			const row =
				button.closest(
					'tr.r'
				);

			if(!row){
				return;
			}

			const url =
				row.getAttribute(
					'data-print'
				)
				|| '';

			try{

				const response =
					await fetch(
						withSession(
							url
						),
						{
							credentials:
								'same-origin'
						}
					);

				const json =
					await response.json();

				if(
					json
					&& json.ok
				){

					showToast(
						'Sent to Europe printer.',
						true
					);

				}else{

					showToast(
						json
						&& json.error
							? json.error
							: 'Print failed.',
						false
					);
				}

			}catch(error){

				showToast(
					'Network error.',
					false
				);
			}
		}
	);


	/* =====================================================
	 * NOTES
	 * =================================================== */

	document.addEventListener(
		'click',
		function(event){

			const button =
				event.target.closest(
					'.btn.note'
				);

			if(!button){
				return;
			}

			event.preventDefault();

			const row =
				button.closest(
					'tr.r'
				);

			const notes =
				row
					? (
						row.getAttribute(
							'data-notes'
						)
						|| ''
					).trim()
					: '';

			if(!notes){
				return;
			}

			openModal(
				'<div style="font-weight:900;margin-bottom:8px;">Notes</div>'
				+ '<div style="white-space:pre-wrap;font-size:14px;line-height:1.5;">'
				+ escapeHtml(
					notes
				)
				+ '</div>',
				30
			);
		}
	);


	/* =====================================================
	 * ORDER DETAILS
	 * =================================================== */

	document.addEventListener(
		'click',
		function(event){

			const link =
				event.target.closest(
					'.ordlink'
				);

			if(!link){
				return;
			}

			event.preventDefault();

			const row =
				link.closest(
					'tr.r'
				);

			if(!row){
				return;
			}

			openModal(
				'<div style="font-weight:900;margin-bottom:10px;">Order Details</div>'
				+ (
					row.getAttribute(
						'data-items'
					)
					|| ''
				),
				300
			);
		}
	);


	/* =====================================================
	 * TRACKING EDIT
	 * =================================================== */

	document.addEventListener(
		'click',
		function(event){

			const button =
				event.target.closest(
					'.trkedit'
				);

			if(!button){
				return;
			}

			event.preventDefault();

			const row =
				button.closest(
					'tr.r'
				);

			if(!row){
				return;
			}

			const orderId =
				parseInt(
					row.getAttribute(
						'data-oid'
					)
					|| '0',
					10
				);

			const current =
				(
					row.getAttribute(
						'data-trk'
					)
					|| ''
				).trim();

			const ts =
				(
					row.getAttribute(
						'data-trkts'
					)
					|| ''
				).trim();

			const sig =
				(
					row.getAttribute(
						'data-trksig'
					)
					|| ''
				).trim();

			if(
				!orderId
				|| !ts
				|| !sig
			){

				showToast(
					'Tracking token missing.',
					false
				);

				return;
			}

			openModal(
				'<div style="font-weight:900;margin-bottom:10px;">Edit EU tracking</div>'
				+ '<div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap;">'
				+ '<input id="ssTrackingInput" type="text" value="'
				+ escapeHtml(
					current
				)
				+ '" placeholder="Tracking number" style="flex:1;min-width:260px;border:1px solid var(--ss-border);border-radius:10px;padding:12px;background:var(--ss-input);color:var(--ss-text);font-weight:800;">'
				+ '<button id="ssTrackingSave" class="btn" style="background:var(--ss-accent);border-color:var(--ss-accent);color:#fff;padding:10px 13px;">Save</button>'
				+ '<button id="ssTrackingCancel" class="btn" style="padding:10px 13px;">Cancel</button>'
				+ '</div>',
				0
			);

			const cancel =
				document.getElementById(
					'ssTrackingCancel'
				);

			if(cancel){

				cancel.addEventListener(
					'click',
					function(){

						window.PeptiSSCloseModal();
					}
				);
			}

			const save =
				document.getElementById(
					'ssTrackingSave'
				);

			if(save){

				save.addEventListener(
					'click',
					async function(){

						const input =
							document.getElementById(
								'ssTrackingInput'
							);

						const value =
							input
								? input.value.trim()
								: '';

						const url =
							new URL(
								location.href
							);

						url.searchParams.set(
							'do',
							'update_tracking'
						);

						url.searchParams.set(
							'oid',
							String(
								orderId
							)
						);

						url.searchParams.set(
							'ts',
							ts
						);

						url.searchParams.set(
							'sig',
							sig
						);

						url.searchParams.set(
							'tracking',
							value
						);

						try{

							const response =
								await fetch(
									withSession(
										url
									),
									{
										credentials:
											'same-origin'
									}
								);

							const json =
								await response
									.json()
									.catch(
										function(){
											return null;
										}
									);

							if(
								!json
								|| !json.ok
							){

								showToast(
									json
									&& json.error
										? 'Save error: '
											+ json.error
										: 'Save failed.',
									false
								);

								return;
							}

							const tracking =
								(
									json.tracking
									|| ''
								).trim();

							row.setAttribute(
								'data-trk',
								tracking
							);

							const cell =
								row.querySelector(
									'td.tracking'
								);

							if(cell){

								const led =
									cell.querySelector(
										'.led'
									);

								const span =
									cell.querySelector(
										'.trk'
									);

								if(led){

									led.classList.toggle(
										'on',
										Boolean(
											tracking
										)
									);
								}

								if(span){

									span.innerHTML =
										tracking
											? escapeHtml(
												tracking
											)
											: '<span class="muted">—</span>';
								}
							}

							window.PeptiSSCloseModal();

							showToast(
								'Tracking updated.',
								true
							);

						}catch(error){

							showToast(
								'Network error.',
								false
							);
						}
					}
				);
			}
		}
	);


	/* =====================================================
	 * FILTERS
	 * =================================================== */

	function rowMatchesView(
		row
	){

		const kind =
			row.getAttribute(
				'data-kind'
			)
			|| '';

		if(currentView === 'ship'){

			return kind === 'ship';
		}

		if(currentView === 'backorder'){

			return kind === 'backorder';
		}

		if(currentView === 'completed'){

			return kind === 'completed';
		}

		if(currentView === 'notes'){

			const notes =
				(
					row.getAttribute(
						'data-notes'
					)
					|| ''
				).trim();

			return (
				kind === 'ship'
				|| kind === 'backorder'
			)
			&& notes !== '';
		}

		return true;
	}


	function sortRows(){

		if(!tbody){
			return;
		}

		const rows =
			Array.from(
				tbody.querySelectorAll(
					'tr.r'
				)
			);

		rows.sort(
			function(first, second){

				const firstTime =
					parseInt(
						first.getAttribute(
							'data-sort-time'
						)
						|| '0',
						10
					);

				const secondTime =
					parseInt(
						second.getAttribute(
							'data-sort-time'
						)
						|| '0',
						10
					);

				return oldestFirst
					? firstTime
						- secondTime
					: secondTime
						- firstTime;
			}
		);

		rows.forEach(
			row =>
				tbody.appendChild(
					row
				)
		);
	}


	function applyFilters(){

		sortRows();

		const query =
			search
				? search.value
					.trim()
					.toLowerCase()
				: '';

		tbody
			.querySelectorAll(
				'tr.r'
			)
			.forEach(
				function(row){

					const matchesView =
						rowMatchesView(
							row
						);

					const matchesSearch =
						!query
						||
						(
							row.innerText
							|| ''
						)
						.toLowerCase()
						.includes(
							query
						);

					row.style.display =
						matchesView
						&& matchesSearch
							? ''
							: 'none';
				}
			);

		setTimeout(
			preloadVisibleQr,
			100
		);
	}


	function setView(
		view
	){

		currentView =
			view;

		document.body
			.classList
			.toggle(
				'pepti-ss-show-email',
				view === 'ship'
				|| view === 'completed'
			);

		document
			.querySelectorAll(
				'.kpi'
			)
			.forEach(
				function(card){

					card.classList.toggle(
						'active',
						card.dataset.view
							=== view
					);
				}
			);

		const labels = {
			ship:
				'EU To Ship',

			backorder:
				'EU Backorders',

			completed:
				'Completed Today',

			notes:
				'Customer Notes'
		};

		if(viewPill){

			viewPill.textContent =
				'Viewing: '
				+ (
					labels[view]
					|| 'EU Orders'
				);
		}

		applyFilters();
	}


	document
		.getElementById(
			'ssKpiShip'
		)
		?.addEventListener(
			'click',
			function(){

				setView(
					'ship'
				);
			}
		);


	document
		.getElementById(
			'ssKpiBackorder'
		)
		?.addEventListener(
			'click',
			function(){

				setView(
					'backorder'
				);
			}
		);


	document
		.getElementById(
			'ssKpiCompleted'
		)
		?.addEventListener(
			'click',
			function(){

				setView(
					'completed'
				);
			}
		);


	document
		.getElementById(
			'ssKpiNotes'
		)
		?.addEventListener(
			'click',
			function(){

				setView(
					'notes'
				);
			}
		);


	if(search){

		search.addEventListener(
			'input',
			applyFilters
		);
	}


	try{

		oldestFirst =
			localStorage.getItem(
				OLDEST_KEY
			)
			=== '1';

	}catch(error){}


	function updateSortButton(){

		if(!oldestButton){
			return;
		}

		oldestButton.classList.toggle(
			'active',
			oldestFirst
		);

		oldestButton.textContent =
			oldestFirst
				? '↓ Newest first'
				: '↑ Oldest first';
	}


	if(oldestButton){

		oldestButton.addEventListener(
			'click',
			function(){

				oldestFirst =
					!oldestFirst;

				try{

					localStorage.setItem(
						OLDEST_KEY,
						oldestFirst
							? '1'
							: '0'
					);

				}catch(error){}

				updateSortButton();

				applyFilters();

				showToast(
					oldestFirst
						? 'Oldest Europe orders first.'
						: 'Newest Europe orders first.',
					true
				);
			}
		);
	}


	updateSortButton();

	setView(
		'ship'
	);


	/* =====================================================
	 * AUTO REFRESH
	 * =================================================== */

	const refreshSeconds =
		<?php echo (int) PEPTI_SS_REFRESH_SECONDS; ?>;


	if(refreshSeconds > 0){

		let refreshTimer =
			null;


		function refreshBoard(){

			if(
				window.PeptiSSHasModalOpen
				&& window.PeptiSSHasModalOpen()
			){
				return;
			}

			const url =
				new URL(
					location.href
				);

			url.searchParams.set(
				'_r',
				Date.now()
			);

			location.replace(
				url.toString()
			);
		}


		function armRefresh(){

			if(refreshTimer){

				clearTimeout(
					refreshTimer
				);
			}

			refreshTimer =
				setTimeout(
					refreshBoard,
					refreshSeconds
						* 1000
				);
		}


		armRefresh();


		[
			'click',
			'keydown',
			'mousemove',
			'touchstart'
		].forEach(
			function(eventName){

				addEventListener(
					eventName,
					function(){

						if(
							!(
								window.PeptiSSHasModalOpen
								&& window.PeptiSSHasModalOpen()
							)
						){

							armRefresh();
						}
					},
					{
						passive:
							true
					}
				);
			}
		);


		document.addEventListener(
			'visibilitychange',
			function(){

				if(
					document.visibilityState
						=== 'visible'
					&& !(
						window.PeptiSSHasModalOpen
						&& window.PeptiSSHasModalOpen()
					)
				){

					refreshBoard();
				}
			}
		);
	}

})();
</script>


<script>
(function(){

	'use strict';


	/* =====================================================
	 * HARDWARE BARCODE SCANNER
	 * =================================================== */

	const TYPE_GAP_MS =
		300;

	const MAX_BUFFER =
		512;

	const SAME_HOST =
		location.host;


	let buffer =
		'';

	let timer =
		null;


	function reset(){

		buffer =
			'';

		if(timer){

			clearTimeout(
				timer
			);

			timer =
				null;
		}
	}


	function looksLikeUrl(
		value
	){

		value =
			value.trim()
				.replace(
					/^<|>$/g,
					''
				);

		if(
			/^[a-z][a-z0-9+.-]*:\/\//i
				.test(
					value
				)
		){
			return true;
		}

		if(
			value.startsWith(
				'/'
			)
		){
			return true;
		}

		if(
			/^[\w.-]+\.[a-z]{2,}([/:?].*)?$/i
				.test(
					value
				)
		){
			return true;
		}

		return false;
	}


	function normaliseUrl(
		value
	){

		value =
			value.trim()
				.replace(
					/^<|>$/g,
					''
				);

		let url;


		if(
			/^[\w.-]+\.[a-z]{2,}([/:?].*)?$/i
				.test(
					value
				)
		){

			url =
				new URL(
					location.protocol
					+ '//'
					+ value
				);

		}else if(
			value.startsWith(
				'/'
			)
		){

			url =
				new URL(
					value,
					location.origin
				);

		}else{

			url =
				new URL(
					value
				);
		}


		if(
			url.host
			!== SAME_HOST
		){

			throw new Error(
				'host'
			);
		}


		const session =
			new URLSearchParams(
				location.search
			).get(
				'ss_session'
			)
			||
			sessionStorage.getItem(
				'pepti_ss_session_token'
			)
			|| '';


		if(
			session
			&& !url.searchParams.get(
				'ss_session'
			)
		){

			url.searchParams.set(
				'ss_session',
				session
			);
		}

		return url.href;
	}


	async function sendTrackingScan(
		code
	){

		const tracking =
			code.trim();

		if(!tracking){
			return;
		}


		const notify =
			window.PeptiSSNotify
			||
			function(
				message
			){

				const toast =
					document.getElementById(
						'ssToast'
					);

				if(toast){

					toast.textContent =
						message;

					toast.classList.add(
						'show'
					);

					setTimeout(
						function(){

							toast.classList.remove(
								'show'
							);

						},
						2200
					);
				}
			};


		try{

			const url =
				new URL(
					location.href
				);

			const session =
				new URLSearchParams(
					location.search
				).get(
					'ss_session'
				)
				||
				sessionStorage.getItem(
					'pepti_ss_session_token'
				)
				|| '';


			if(
				session
				&& !url.searchParams.get(
					'ss_session'
				)
			){

				url.searchParams.set(
					'ss_session',
					session
				);
			}


			url.searchParams.set(
				'do',
				'scan_dispatch'
			);

			url.searchParams.set(
				'tracking',
				tracking
			);


			const response =
				await fetch(
					url.toString(),
					{
						credentials:
							'same-origin'
					}
				);


			const json =
				await response
					.json()
					.catch(
						function(){
							return null;
						}
					);


			if(
				!json
				|| !json.ok
			){

				let message =
					'Scan error';


				if(
					json
					&& json.error
						=== 'not_found'
				){

					message =
						'No Europe Warehouse order found for '
						+ tracking;

				}else if(
					json
					&& json.error
						=== 'wrong_warehouse'
				){

					message =
						'Order belongs to another warehouse.';

				}else if(
					json
					&& json.error
						=== 'denied'
				){

					message =
						'Session expired – log in again.';
				}


				notify(
					message,
					false
				);

				return;
			}


			if(
				json.warehouse
				!== 'eu'
			){

				notify(
					'Dispatch blocked: order is not assigned to Europe.',
					false
				);

				return;
			}


			if(
				json.dispatch_url
			){

				const dispatchResponse =
					await fetch(
						json.dispatch_url,
						{
							credentials:
								'same-origin'
						}
					);


				const dispatchJson =
					await dispatchResponse
						.json()
						.catch(
							function(){
								return null;
							}
						);


				if(
					!dispatchJson
					|| !dispatchJson.ok
				){

					notify(
						'Dispatch failed: '
						+ (
							dispatchJson
							&& dispatchJson.error
								? dispatchJson.error
								: 'unknown error'
						),
						false
					);

					return;
				}


				notify(
					'Europe order #'
					+ (
						dispatchJson.order_number
						|| json.number
						|| ''
					)
					+ ' completed.',
					true
				);


				setTimeout(
					function(){

						const reload =
							new URL(
								location.href
							);

						reload.searchParams.delete(
							'do'
						);

						reload.searchParams.delete(
							'tracking'
						);

						reload.searchParams.set(
							'shipping_senorita',
							'1'
						);

						reload.searchParams.set(
							'_r',
							Date.now()
						);

						location.assign(
							reload.toString()
						);

					},
					900
				);

				return;
			}


			notify(
				'Europe order found but dispatch helper is unavailable.',
				false
			);


		}catch(error){

			notify(
				'Network error.',
				false
			);
		}
	}


	document.addEventListener(
		'keydown',
		function(event){

			const tag =
				(
					event.target
					&& event.target.tagName
						? event.target.tagName
						: ''
				)
				.toLowerCase();


			if(
				tag === 'input'
				|| tag === 'textarea'
				|| (
					event.target
					&& event.target
						.isContentEditable
				)
			){
				return;
			}


			if(
				event.key
				=== 'Enter'
			){

				const scanned =
					buffer;

				reset();


				if(!scanned){
					return;
				}


				if(
					looksLikeUrl(
						scanned
					)
				){

					try{

						const href =
							normaliseUrl(
								scanned
							);


						if(
							window.PeptiSSHasModalOpen
							&& window.PeptiSSHasModalOpen()
						){

							window.PeptiSSCloseModal();
						}


						location.assign(
							href
						);

					}catch(error){}

					return;
				}


				sendTrackingScan(
					scanned
				);

				return;
			}


			if(
				event.key.length
					=== 1
				&& !event.altKey
				&& !event.ctrlKey
				&& !event.metaKey
			){

				buffer +=
					event.key;


				if(
					buffer.length
					> MAX_BUFFER
				){

					buffer =
						buffer.slice(
							-MAX_BUFFER
						);
				}


				if(timer){

					clearTimeout(
						timer
					);
				}


				timer =
					setTimeout(
						reset,
						TYPE_GAP_MS
					);
			}
		}
	);

})();
</script>


</body>
</html>

				<?php

				exit;
			}
		);
	}
);