// looks for app block otherwise adds above checkout button. script runs once
(function () {
	window.rterms = window.rterms || {};
	rterms.metafield = rterms.metafield || {};
	rterms.settings = rterms.settings || {};
	if (rterms.ran || (rterms.settings.only_cart_page && !window.location.pathname.match(/\/cart/))) return;

	rterms.checkouts = [];
	rterms.checkoutEvents = [];
	rterms.addedEvents = false;

	var statsUrl = 'https://terms-relentless.herokuapp.com/statistics-event';

	var checkoutSelectors = rterms.checkoutEl || '[name="checkout"]:not([type="hidden"], .checkout-link__button, .tpo-btn-checkout, .cart-title-button), .cart--totals .cart--nav, a[href^="/checkout"], a[href="/account/login"].cart__submit, button[type="submit"].btn-order, a.btn.cart__checkout, a.cart__submit, input.action_button[value="Checkout"], .wc-proceed-to-checkout button, #cart_form .buttons .btn-primary, a.cart_adev_o, [data-limoniapps-discountninja-checkoutlink], form > button.checkout-button, button.btn_checkout, button.checkout-btn, button[data-href="/checkout"], .cart__footer > .table_medium_up:nth-child(2), #cart-summary .cart-summary__section .btn--empty-cart, button.qsc2-checkout-button, button[name="button-route-2"], .cd-checkout-section-container .cd-checkout-section-button, .cart__checkout-button';
	var dynamicCheckoutSelectors = '.dynamic-checkout__content';

	var precheck = !rterms._3lj2l && rterms.metafield.precheck && rterms.metafield.precheck === 'on';
	var blockDynamic = !rterms._3lj2l && rterms.metafield.dynamic && rterms.metafield.dynamic === 'on';
	var optional = !rterms._3lj2l && rterms.metafield.optional && rterms.metafield.optional === 'on';

	var css = '.rterms-disable-dynamic { content: ""; display: block !important; position: absolute; top: 0; left: 0; right: 0; bottom: 0; }';
	if (!window.location.pathname.match(/\/cart$/)) {
		css += '.terms-relentless { justify-content: flex-start !important; text-align: left !important; padding-left: 4px; }';
	}
	if (rterms.metafield.alignment === 'left') {
		css += '.terms-relentless { justify-content: flex-start !important; text-align: left !important; }';
	} else if (rterms.metafield.alignment === 'center') {
		css += '.terms-relentless { justify-content: center !important; text-align: center !important; }';
	} else if (rterms.metafield.alignment === 'right') {
		css += '.terms-relentless { justify-content: flex-end !important; text-align: right !important; }';
	}
	var style = document.createElement('style');
	style.innerHTML = css;
	if (rterms.ajaxCartStyle) style.innerHTML += rterms.ajaxCartStyle;
	document.head.appendChild(style);

	if (!optional) {
		var dynamics = document.querySelectorAll(dynamicCheckoutSelectors);
		if (dynamics.length && blockDynamic) {
			dynamics.forEach(function (dynamic) {
				cover(dynamic);
			});
		}
	}

	function cover(el) {
		el.style.position = 'relative';
		var div = document.createElement('div');
		div.classList.add('rterms-disable-dynamic');
		el.appendChild(div);
	}

	var text = rterms.metafield.text;
	if (!text) text = 'I accept the <a target="_blank" href="/policies/terms-of-service">terms of service</a>.';
	var noLinks = !text.match(/href="/);
	if (noLinks) {
		text = text.replace(/(terms and conditions|terms of service)/, '<a target="_blank" href="/policies/terms-of-service">$1</a>');
		text = text.replace(/(privacy-policy)/, '<a target="_blank" href="/policies/privacy-policy">$1</a>');
	}

	rterms.checkout = checkout;

	rterms.ran = true;

	// initial add
	var checkouts = [].slice.call(document.querySelectorAll(checkoutSelectors));
	checkouts.forEach(addCheckbox);

	// keep looking for checkout buttons
	if (window.MutationObserver) {
		const observer = new MutationObserver((mutationList, observer) => {
			for (let mutationRecord of mutationList) {
				if (mutationRecord.addedNodes.length) {
					for (let checkout of mutationRecord.addedNodes) {
						if (!checkout.matches) continue;
						// text nodes are objects but don't have matches
						if (checkout.matches(checkoutSelectors)) {
							addCheckbox(checkout);
						}
						var descendants = checkout.querySelectorAll(checkoutSelectors);
						if (descendants) {
							descendants.forEach(function (descendant) {
								addCheckbox(descendant);
							});
						}
					}
				}
			}
		});
		observer.observe(document.body, {
			childList: true,
			subtree: true
		});
	}

	// checkbox view
	if (Math.floor(Math.random() * 9) === 8) {
		request(statsUrl, {type: 'POST', body: {shop: Shopify.shop, event: 'terms_views'}}, function (e) {
			console.log(e);		
		});
	}

	// checkbox click
	document.body.addEventListener('click', function (e) {
		if (e.target.matches('.rterms-checkbox')) {
			if (e.target.checked) {
				// put jQuery click events back
				if (!rterms.addedEvents) {
					rterms.addedEvents = true;
					rterms.checkouts.forEach(function (checkout) {
						try {
							$._data(checkout).events.click = rterms.checkoutEvents.shift();
						} catch (err) {
							// console.log(err);
						}
					});
				}
				// stop blocking dynamic checkouts
				var dynamics = document.querySelectorAll('.rterms-disable-dynamic');
				if (dynamics) dynamics.forEach(function (el) {
					el.style.pointerEvents = 'none';
				});
				// add date/time to attributes
				if (!rterms._3lj2l && rterms.metafield.date && rterms.metafield.date === 'on') {
					request(window.Shopify.routes.root + 'cart/update.js', {
						type: 'POST',
						body: {
							attributes: {'Terms Accepted At': Date()}
						},
						headers: {'Content-Type': 'application/json'}
					});
				}
				// record click event
				if (Math.floor(Math.random() * 9) === 8) {
					request(statsUrl, {type: 'POST', body: {shop: Shopify.shop, event: 'terms_clicks'}}, function (e) {
						console.log(e);
					});
				}
				// remove bndlr class
				rterms.checkouts.forEach(function (checkout) {
					checkout.classList.remove('bndlr-button-disabled');
				});
				// remove Zapiet override
				if (e.target && e.target.checked) {
					window.customCheckoutValidation = null;
				}
			} else {
				var allUnchecked = true;
				var checkouts = document.querySelectorAll('.rterms-checkbox');
				if (checkouts) for (var i = 0; i < checkouts.length; i++) {
					if (checkouts[i].checked) {
						allUnchecked = false;
						break;
					}
				}
				if (allUnchecked && !optional) {
					if (rterms.addedEvents) {
						rterms.addedEvents = false;
						rterms.checkouts.forEach(function (checkout) {
							var jQueryEvents = [];
							try {
								jQueryEvents = $._data(checkout).events.click;
								$._data(checkout).events.click = [];
							} catch (err) {
								// console.log(err);
							}
							rterms.checkoutEvents.push(jQueryEvents);
						});
					}
					var dynamics = document.querySelectorAll('.rterms-disable-dynamic');
					if (dynamics) dynamics.forEach(function (el) {
						el.style.pointerEvents = 'auto';
					});
					if (window.bndlr) {
						rterms.checkouts.forEach(function (checkout) {
							checkout.classList.add('bndlr-button-disabled');
						});
					}
					if (window.ZapietWidgetConfig) {
						window.customCheckoutValidation = rterms.checkout;
					}
				}
			}
		} else if (e.target.matches('.rterms-disable-dynamic')) {
			alert(rterms.metafield.alert_message || 'Please select the terms of service');
		}
	});

	if (precheck) {
		document.querySelectorAll('.rterms-checkbox').forEach(function (checkbox) {
			if (checkbox.checked) return;
			checkbox.click();
		});
	}

	function addCheckbox(checkout) {
		if (checkout.closest('cart-notification') && window.location.pathname.match(/\/cart/)) return;

		rterms.checkouts.push(checkout);

		if (!optional) {
			var jQueryEvents = [];
			try {
				jQueryEvents = $._data(checkout).events.click;
				$._data(checkout).events.click = [];
			} catch (err) {
				// console.log(err);
			}
			rterms.checkoutEvents.push(jQueryEvents);

			setTimeout(function () { // bndlr script is slow
				if (window.bndlr && !optional) {
					checkout.classList.add('bndlr-button-disabled');
				}
			}, 1000);

			// add checkout event
			// check if bcpo event
			if (window.ZapietWidgetConfig) {
				window.customCheckoutValidation = rterms.checkout;
				setTimeout(function () { // to compete with other scripts
					window.customCheckoutValidation = rterms.checkout;
				}, 5000);
			} else {
				checkout.addEventListener('click', rterms.checkout);
			}
		}

		// check visibility - this caused problems
		// if (checkout.offsetWidth <= 0 && checkout.offsetHeight <= 0) return; // continue
		if (checkout.parentElement.closest('.cart--totals .cart--nav')) return;
		if (checkout.parentElement.querySelector('.terms-relentless')) return; // prevent duplicates
		if (rterms.settings.hide_in_drawer && checkout.closest('#cart-notification-form, sidebar-drawer')) return;

		var div = document.createElement('div');
		div.className = 'terms-relentless';
		div.innerHTML = '<input type="checkbox" id="rterms-' + (rterms.checkouts.length - 1) + '" class="rterms-checkbox" style="' + 
		(!rterms._3lj2l && rterms.metafield.checkbox_color ? 'accent-color: ' + rterms.metafield.checkbox_color + ';' : '') + '"><label for="rterms-' + (rterms.checkouts.length - 1) + '">' + text + '</label>';
		if (rterms.metafield.spacing_top) div.style.marginTop = rterms.metafield.spacing_top + 'px';
		if (rterms.metafield.spacing_right) div.style.marginRight = rterms.metafield.spacing_right + 'px';
		if (rterms.metafield.spacing_bottom) div.style.marginBottom = rterms.metafield.spacing_bottom + 'px';
		if (rterms.metafield.spacing_left) div.style.marginLeft = rterms.metafield.spacing_left + 'px';

		var anchor = checkout;
		if (checkout.previousElementSibling && checkout.previousElementSibling.previousElementSibling && checkout.previousElementSibling.previousElementSibling.previousElementSibling) {
			if (checkout.previousElementSibling.previousElementSibling.previousElementSibling.className === 'cart__shipping') {
				anchor = checkout.previousElementSibling.previousElementSibling;
			}
		}
		if (checkout.previousElementSibling && ((checkout.previousElementSibling.href && checkout.previousElementSibling.href.match(/\/cart$/)) || (checkout.previousElementSibling.name && checkout.previousElementSibling.name === 'update'))) {
			anchor = checkout.previousElementSibling;
		}

		if (checkout.parentElement.querySelector('input[value="Update Cart"]')) {
			anchor = checkout.parentElement.querySelector('input[value="Update Cart"]');
		}

		if (!rterms.settings.ignore_cart_button && checkout.parentElement.parentElement.querySelector('[href="/cart"]')) {
			var link = checkout.parentElement.parentElement.querySelector('[href="/cart"]');
			if (link.innerHTML) {
				anchor = link;
			}
		}

		var ancestor;
		if (ancestor = checkout.closest('[data-cart-drawer] .push-btn, .buy-buttons.buy-buttons--compact')) {
			anchor = ancestor;
		}

		if (anchor.parentElement.querySelector('.terms-relentless')) return; // prevent duplicates

		anchor.before(div);
		if ((!window.Shopify || !Shopify.theme || !Shopify.theme.name || Shopify.theme.name !== 'Blockshop') && !rterms.settings.disableLayoutFix) div.parentNode.style.display = 'block';
	}

	function checkout(e) {
		// check for any checked checkbox
		var checked = false;
		document.querySelectorAll('.rterms-checkbox').forEach(function (checkbox) {
			if (checkbox.checked) {
				checked = true;
			}
		});
		if (!checked) {
			// to do: make nicer alert. with custom message
			alert(rterms.metafield.alert_message || 'Please select the terms of service');
			if (e && e.preventDefault) {
				e.preventDefault();
				e.stopPropagation();
				setTimeout(function() {
					if (!e.target) return;
					e.target.className = e.target.className.replace('btn--loading', '');
					e.target.disabled = false;
				}, 100);
			}
		}
	};

	function request(url, obj, res, rej) {
		if (!window.XMLHttpRequest) return rej('no xhr');
		var request = new XMLHttpRequest();
		// request.responseType = 'json';
		request.onreadystatechange = function () {
			if (this.readyState == 4) {
				if (this.status == 200) {
					try {
						res(JSON.parse(this.response));
					} catch (err) {
						if (rej) rej(err);
					}
				} else {
					if (rej) rej(this.status);
				}
			}
		};
		request.open(obj.type, url, true);
		var contentType = (obj.headers && obj.headers['Content-Type']) || 'application/x-www-form-urlencoded';
		request.setRequestHeader('Content-Type', contentType);
		var dataString = '';
		if (contentType === 'application/x-www-form-urlencoded') {
			for (var prop in obj.body) {
				dataString += encodeURIComponent(prop) + '=' + encodeURIComponent(obj.body[prop]) + '&';
			}
			dataString = dataString.slice(0, -1);
		} else {
			dataString = JSON.stringify(obj.body);
		}
		request.send(dataString);
	}

	// // pay-as-you-go plan
	// document.addEventListener('visibilitychange', function () {
	// 	if (document.visibilityState === 'hidden') {
	// 		navigator.sendBeacon('https://terms-relentless.herokuapp.com/used-check', {checked: true});
	// 	}
	// });
}());