var vp = document.querySelector('meta[name="viewport"]'); if (vp) { vp.setAttribute('content', 'width=device-width, initial-scale=1.0'); }

// Precio unitario destacado + desglose con jerarquia visual (sitio completo)
// Aplica solo en fichas de producto con atributo de variacion "Cantidad" (select name="attribute_cantidad").
// Si el producto no tiene ese atributo, o no existe el desglose de neto/IVA, el script no hace nada.
(function() {
  if (typeof jQuery === "undefined") return;
  var $ = jQuery;
  var form = document.querySelector("form.variations_form");
  if (!form) return;
  var gen = 0;
  var ICON_TAG = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="20" height="20"><path d="M20.59 13.41 13.42 20.58a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"/><circle cx="7" cy="7" r="1.3" fill="currentColor" stroke="none"/></svg>';
  var ICON_RECEIPT = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" width="14" height="14"><path d="M5 3h14v18l-2.5-1.5L14 21l-2-1.5L10 21l-2.5-1.5L5 21z"/><path d="M8 7h8M8 11h8M8 15h5"/></svg>';
  var ICON_PERCENT = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" width="14" height="14"><line x1="5" y1="19" x2="19" y2="5"/><circle cx="6.5" cy="6.5" r="2.3"/><circle cx="17.5" cy="17.5" r="2.3"/></svg>';
  var ICON_CHECK = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="15" height="15"><circle cx="12" cy="12" r="9"/><path d="M8 12.3l2.5 2.5 5-5.6"/></svg>';
  function formatCLP(n) {
    return Math.round(n).toLocaleString("es-CL");
  }
  function getPriceBox() {
    return document.querySelector(".single_variation_wrap .woocommerce-variation-price") || document.querySelector(".single_variation_wrap .single_variation");
  }
  function extractAmount(text) {
    if (!text) return null;
    var m = text.match(/\$[\d.,]+/);
    return m ? m[0] : null;
  }
  function removeAll() {
    var badge = document.getElementById("wcv-unit-price-bs70");
    if (badge) badge.remove();
    var pretty = document.getElementById("wcv-desglose-pretty");
    if (pretty) pretty.remove();
  }
  function render(unitPrice, myGen) {
    if (myGen !== gen) return;
    var priceBox = getPriceBox();
    if (!priceBox || !priceBox.parentNode) return;
    priceBox.style.display = "none";

    var badge = document.getElementById("wcv-unit-price-bs70");
    if (!badge) {
      badge = document.createElement("div");
      badge.id = "wcv-unit-price-bs70";
      priceBox.parentNode.insertBefore(badge, priceBox.nextSibling);
    }
    badge.style.cssText = "display:inline-flex;align-items:center;gap:10px;margin:4px 0 0;padding:12px 18px;background:#FBEAF0;border-radius:10px;";
    badge.innerHTML = '<span style="color:#D4307D;display:flex;flex-shrink:0;">' + ICON_TAG + '</span><span><span style="display:block;font-size:12px;color:#993556;line-height:1.3;">Precio unitario</span><span style="font-size:24px;font-weight:700;color:#D4307D;line-height:1.25;">$' + formatCLP(unitPrice) + '<span style="font-size:13px;font-weight:400;color:#993556;"> c/u + IVA</span></span></span>';

    var neto = document.getElementById("desglose-neto");
    var iva = document.getElementById("desglose-iva");
    var total = document.getElementById("desglose-total");
    if (neto && iva && total) {
      var origBox = neto.parentElement;
      if (origBox) origBox.style.display = "none";
      var netoVal = extractAmount(neto.textContent);
      var ivaVal = extractAmount(iva.textContent);
      var totalVal = extractAmount(total.textContent);
      var pretty = document.getElementById("wcv-desglose-pretty");
      if (!pretty) {
        pretty = document.createElement("div");
        pretty.id = "wcv-desglose-pretty";
        origBox.parentNode.insertBefore(pretty, origBox.nextSibling);
      }
      pretty.style.cssText = "border:1px solid #eee;border-radius:8px;padding:10px 14px;margin-top:10px;max-width:280px;";
      pretty.innerHTML = 
        '<div style="display:flex;align-items:center;justify-content:space-between;padding:4px 0;font-size:13px;color:#767676;">' +
          '<span style="display:flex;align-items:center;gap:6px;">' + ICON_RECEIPT + 'Total neto</span>' +
          '<span>' + netoVal + '</span>' +
        '</div>' +
        '<div style="display:flex;align-items:center;justify-content:space-between;padding:4px 0;font-size:13px;color:#767676;">' +
          '<span style="display:flex;align-items:center;gap:6px;">' + ICON_PERCENT + 'IVA</span>' +
          '<span>' + ivaVal + '</span>' +
        '</div>' +
        '<div style="border-top:1px solid #eee;margin-top:6px;padding-top:8px;display:flex;align-items:center;justify-content:space-between;">' +
          '<span style="display:flex;align-items:center;gap:6px;font-size:14px;font-weight:600;color:#333;">' + '<span style="color:#D4307D;display:flex;">' + ICON_CHECK + '</span>Total IVA incluido</span>' +
          '<span style="font-size:17px;font-weight:700;color:#D4307D;">' + totalVal + '</span>' +
        '</div>';
    }
  }
  $(form).on("found_variation", function(event, variation) {
    gen++;
    var myGen = gen;
    var qtySelect = form.querySelector('select[name="attribute_cantidad"]');
    var qty = qtySelect ? parseInt(qtySelect.value, 10) : null;
    if (qty && variation && variation.display_price) {
      setTimeout(function() { render(variation.display_price / qty, myGen); }, 450);
    }
  });
  $(form).on("reset_data hide_variation", function() {
    gen++;
    removeAll();
  });
})();

// Google Search Console site verification
(function() {
  if (document.querySelector('meta[name="google-site-verification"]')) return;
  var m = document.createElement('meta');
  m.name = 'google-site-verification';
  m.content = 'uPbqWwxjc2jmyDI1VH59BQNwI4s6_-8uJOZVGzIYpqc';
  document.head.appendChild(m);
})();

// Rediseno visual pagina Quienes Somos (tarjetas, cifras, sello destacado, fix de texto)
(function() {
	if (!/quienes-somos/.test(window.location.pathname)) return;
	function ready(fn) {
		if (document.readyState !== 'loading') fn();
		else document.addEventListener('DOMContentLoaded', fn);
	}
	ready(function() {
		try {
			var introH3 = Array.prototype.find.call(document.querySelectorAll('h3.elementor-heading-title'), function(h){ return /siii/.test(h.textContent); });
			if (introH3) {
				introH3.innerHTML = introH3.innerHTML.replace('liderada por mujeres, siii por mujeres que desde 2015', 'liderada por mujeres desde 2015');
			}

			var w2 = document.querySelector('.elementor-element-7375191');
			if (w2) {
				var dupPs = w2.querySelectorAll('p');
				if (dupPs.length > 1 && /Adaptabilidad/.test(dupPs[0].textContent)) {
					dupPs[0].remove();
				}
			}

			var widgetIds = ['724c232', '7769abf', '77e1fbd', '7375191'];
			widgetIds.forEach(function(id) {
				var w = document.querySelector('.elementor-element-' + id);
				if (!w) return;
				var paras = w.querySelectorAll('p');
				paras.forEach(function(p) {
					var b = p.querySelector('b');
					if (!b || !/^[\u2013-]\s/.test(b.textContent.trim())) return;
					p.style.margin = '0 0 16px';
				});
			});

			var selloImg = document.querySelector('.elementor-element-142ca44 img');
			if (selloImg) {
				var wrap = selloImg.closest('.elementor-widget-image');
				if (wrap) {
					wrap.style.background = '#fff';
					wrap.style.border = '2px solid #D4307D';
					wrap.style.borderRadius = '16px';
					wrap.style.padding = '16px';
					wrap.style.display = 'inline-block';
					wrap.style.boxShadow = '0 4px 14px rgba(0,0,0,0.08)';
				}
			}

			var intro = Array.prototype.find.call(document.querySelectorAll('h3.elementor-heading-title'), function(h){ return /desde 2015/.test(h.textContent); });
			if (intro && !document.querySelector('.vc-stats-bar')) {
				var bar = document.createElement('div');
				bar.className = 'vc-stats-bar';
				bar.style.cssText = 'display:flex;flex-wrap:wrap;justify-content:center;gap:32px;max-width:900px;margin:32px auto 0;padding:0 20px;';
				var stats = [['2015','Desde'],['100%','Liderado por mujeres'],['Chile','Despacho a todo el país']];
				stats.forEach(function(s) {
					var item = document.createElement('div');
					item.style.cssText = 'text-align:center;min-width:140px;';
					item.innerHTML = '<div style="font-size:42px;font-weight:700;color:#D4307D;">' + s[0] + '</div><div style="font-size:16px;color:#555;margin-top:6px;">' + s[1] + '</div>';
					bar.appendChild(item);
				});
				var introSection = intro.closest('.elementor-widget-heading') || intro.closest('.elementor-column') || intro.parentElement;
				if (introSection && introSection.parentElement) {
					introSection.parentElement.insertBefore(bar, introSection.nextSibling);
				}
			}
		} catch (e) {}
	});
})();

// Herramienta "Disena tu producto" - subir logo y ubicarlo sobre foto de producto
(function() {
	if (!/disena-tu-producto/.test(window.location.pathname)) return;
	function ready(fn) {
		if (document.readyState !== 'loading') fn();
		else document.addEventListener('DOMContentLoaded', fn);
	}
	ready(function() {
		var root = document.getElementById('vc-logo-designer');
		if (!root) return;

		var state = {
			products: [],
			selected: null,
			logoImg: null,
			logoNatural: {w:0,h:0},
			pos: {xPct:35, yPct:35, wPct:30, angle:0}
		};

		function el(tag, attrs, children) {
			var e = document.createElement(tag);
			if (attrs) {
				Object.keys(attrs).forEach(function(k) {
					if (k === 'style') { e.style.cssText = attrs[k]; }
					else if (k === 'text') { e.textContent = attrs[k]; }
					else { e.setAttribute(k, attrs[k]); }
				});
			}
			(children || []).forEach(function(c) { if (c) e.appendChild(c); });
			return e;
		}

		function renderGrid() {
			root.innerHTML = '';
			var wrap = el('div', {style:'max-width:1100px;margin:0 auto;padding:20px 20px 60px;'});
			var heading = el('h2', {text:'Elige un producto para probar tu logo', style:'font-size:22px;margin-bottom:4px;color:#222;'});
			var sub = el('p', {text:'Selecciona uno de nuestros productos y luego sube tu logo para ver como se veria.', style:'color:#666;margin-bottom:20px;'});
			var searchWrap = el('div', {style:'margin-bottom:20px;'});
			var search = el('input', {type:'text', placeholder:'Buscar producto...', style:'width:100%;max-width:360px;padding:10px 14px;border:1px solid #ddd;border-radius:8px;font-size:14px;'});
			searchWrap.appendChild(search);
			var grid = el('div', {style:'display:grid;grid-template-columns:repeat(auto-fill, minmax(180px, 1fr));gap:16px;'});

			function paint(list) {
				grid.innerHTML = '';
				list.forEach(function(p) {
					var img = p.images && p.images[0] ? p.images[0].src : '';
					var card = el('div', {style:'cursor:pointer;border:1px solid #eee;border-radius:12px;overflow:hidden;transition:box-shadow .2s ease, transform .2s ease;background:#fff;'});
					card.addEventListener('mouseenter', function(){ card.style.boxShadow='0 6px 18px rgba(0,0,0,0.08)'; card.style.transform='translateY(-2px)'; });
					card.addEventListener('mouseleave', function(){ card.style.boxShadow='none'; card.style.transform='none'; });
					var imgEl = el('img', {src:img, style:'width:100%;height:160px;object-fit:cover;display:block;background:#f5f5f5;'});
					var nameEl = el('div', {text:p.name, style:'padding:10px 12px;font-size:13px;color:#333;font-weight:500;'});
					card.appendChild(imgEl);
					card.appendChild(nameEl);
					card.addEventListener('click', function() { selectProduct(p); });
					grid.appendChild(card);
				});
				if (list.length === 0) {
					grid.appendChild(el('p', {text:'No se encontraron productos.', style:'color:#888;'}));
				}
			}

			paint(state.products);

			var searchTimer = null;
			search.addEventListener('input', function() {
				clearTimeout(searchTimer);
				var q = search.value.toLowerCase();
				searchTimer = setTimeout(function() {
					var filtered = state.products.filter(function(p) { return p.name.toLowerCase().indexOf(q) !== -1; });
					paint(filtered);
				}, 200);
			});

			wrap.appendChild(heading);
			wrap.appendChild(sub);
			wrap.appendChild(searchWrap);
			wrap.appendChild(grid);
			root.appendChild(wrap);
		}

		function selectProduct(p) {
			state.selected = p;
			state.pos = {xPct:35, yPct:35, wPct:30, angle:0};
			renderEditor();
		}

		function renderEditor() {
			root.innerHTML = '';
			var wrap = el('div', {style:'max-width:1100px;margin:0 auto;padding:20px 20px 60px;'});

			var backBtn = el('button', {text:'Elegir otro producto', style:'background:none;border:none;color:#D4307D;font-size:14px;cursor:pointer;padding:0;margin-bottom:16px;'});
			backBtn.addEventListener('click', renderGrid);

			var layout = el('div', {style:'display:flex;gap:28px;flex-wrap:wrap;align-items:flex-start;'});

			var previewCol = el('div', {style:'flex:1 1 420px;min-width:300px;'});
			var stage = el('div', {style:'position:relative;width:100%;border:1px solid #eee;border-radius:12px;overflow:hidden;background:#fafafa;touch-action:none;'});
			var prodImgSrc = state.selected.images && state.selected.images[0] ? state.selected.images[0].src : '';
			var prodImg = el('img', {src:prodImgSrc, style:'display:block;width:100%;height:auto;user-select:none;pointer-events:none;'});
			stage.appendChild(prodImg);

			var logoBox = el('div', {style:'position:absolute;left:35%;top:35%;width:30%;cursor:grab;display:none;touch-action:none;'});
			var logoImgEl = el('img', {style:'width:100%;display:block;user-select:none;pointer-events:none;'});
			var handle = el('div', {style:'position:absolute;right:-8px;bottom:-8px;width:16px;height:16px;background:#D4307D;border:2px solid #fff;border-radius:50%;cursor:nwse-resize;touch-action:none;'});
			logoBox.appendChild(logoImgEl);
			logoBox.appendChild(handle);
			stage.appendChild(logoBox);

			previewCol.appendChild(stage);

			var controlsCol = el('div', {style:'flex:0 0 300px;min-width:260px;'});
			var prodTitle = el('div', {text:state.selected.name, style:'font-weight:500;font-size:16px;margin-bottom:14px;color:#222;'});

			var uploadLabel = el('label', {text:'Sube tu logo', style:'display:block;font-size:13px;color:#555;margin-bottom:6px;'});
			var uploadInput = el('input', {type:'file', accept:'image/*', style:'display:block;margin-bottom:18px;font-size:13px;'});

			var sizeLabel = el('label', {text:'Tamano', style:'display:block;font-size:13px;color:#555;margin-bottom:6px;'});
			var sizeSlider = el('input', {type:'range', min:'8', max:'80', value:'30', style:'width:100%;margin-bottom:18px;'});

			var rotLabel = el('label', {text:'Rotacion', style:'display:block;font-size:13px;color:#555;margin-bottom:6px;'});
			var rotSlider = el('input', {type:'range', min:'0', max:'360', value:'0', style:'width:100%;margin-bottom:22px;'});

			var hint = el('p', {text:'Arrastra el logo para moverlo. Usa el punto rosado para cambiar el tamano.', style:'font-size:12px;color:#888;margin-bottom:18px;'});

			var downloadBtn = el('button', {text:'Descargar vista previa', style:'width:100%;background:#D4307D;color:#fff;border:none;border-radius:8px;padding:12px 16px;font-size:14px;font-weight:500;cursor:pointer;opacity:0.5;'});
			downloadBtn.disabled = true;

			controlsCol.appendChild(prodTitle);
			controlsCol.appendChild(uploadLabel);
			controlsCol.appendChild(uploadInput);
			controlsCol.appendChild(sizeLabel);
			controlsCol.appendChild(sizeSlider);
			controlsCol.appendChild(rotLabel);
			controlsCol.appendChild(rotSlider);
			controlsCol.appendChild(hint);
			controlsCol.appendChild(downloadBtn);

			layout.appendChild(previewCol);
			layout.appendChild(controlsCol);

			wrap.appendChild(backBtn);
			wrap.appendChild(layout);
			root.appendChild(wrap);

			function applyPos() {
				logoBox.style.left = state.pos.xPct + '%';
				logoBox.style.top = state.pos.yPct + '%';
				logoBox.style.width = state.pos.wPct + '%';
				logoImgEl.style.transform = 'rotate(' + state.pos.angle + 'deg)';
			}

			uploadInput.addEventListener('change', function(e) {
				var file = e.target.files && e.target.files[0];
				if (!file) return;
				var reader = new FileReader();
				reader.onload = function(ev) {
					var img = new Image();
					img.onload = function() {
						state.logoImg = img;
						state.logoNatural = {w: img.naturalWidth, h: img.naturalHeight};
						logoImgEl.src = ev.target.result;
						logoBox.style.display = 'block';
						applyPos();
						downloadBtn.disabled = false;
						downloadBtn.style.opacity = '1';
					};
					img.src = ev.target.result;
				};
				reader.readAsDataURL(file);
			});

			sizeSlider.addEventListener('input', function() {
				state.pos.wPct = parseFloat(sizeSlider.value);
				applyPos();
			});
			rotSlider.addEventListener('input', function() {
				state.pos.angle = parseFloat(rotSlider.value);
				applyPos();
			});

			var dragging = false, dragStart = null;
			logoBox.addEventListener('pointerdown', function(e) {
				dragging = true;
				logoBox.style.cursor = 'grabbing';
				dragStart = {x: e.clientX, y: e.clientY, xPct: state.pos.xPct, yPct: state.pos.yPct};
				try { logoBox.setPointerCapture(e.pointerId); } catch(err) {}
			});
			logoBox.addEventListener('pointermove', function(e) {
				if (!dragging) return;
				var rect = stage.getBoundingClientRect();
				var dxPct = ((e.clientX - dragStart.x) / rect.width) * 100;
				var dyPct = ((e.clientY - dragStart.y) / rect.height) * 100;
				state.pos.xPct = Math.max(0, Math.min(95, dragStart.xPct + dxPct));
				state.pos.yPct = Math.max(0, Math.min(95, dragStart.yPct + dyPct));
				applyPos();
			});
			logoBox.addEventListener('pointerup', function(e) {
				dragging = false;
				logoBox.style.cursor = 'grab';
			});

			var resizing = false, resizeStart = null;
			handle.addEventListener('pointerdown', function(e) {
				e.stopPropagation();
				resizing = true;
				resizeStart = {x: e.clientX, wPct: state.pos.wPct};
				try { handle.setPointerCapture(e.pointerId); } catch(err) {}
			});
			handle.addEventListener('pointermove', function(e) {
				if (!resizing) return;
				e.stopPropagation();
				var rect = stage.getBoundingClientRect();
				var dxPct = ((e.clientX - resizeStart.x) / rect.width) * 100;
				var newW = Math.max(8, Math.min(80, resizeStart.wPct + dxPct));
				state.pos.wPct = newW;
				sizeSlider.value = String(newW);
				applyPos();
			});
			handle.addEventListener('pointerup', function(e) { e.stopPropagation(); resizing = false; });

			downloadBtn.addEventListener('click', function() {
				if (!state.logoImg) return;
				var natW = prodImg.naturalWidth || prodImg.width;
				var natH = prodImg.naturalHeight || prodImg.height;
				var canvas = document.createElement('canvas');
				canvas.width = natW;
				canvas.height = natH;
				var ctx = canvas.getContext('2d');
				var baseImg = new Image();
				baseImg.crossOrigin = 'anonymous';
				baseImg.onload = function() {
					ctx.drawImage(baseImg, 0, 0, natW, natH);
					var logoW = (state.pos.wPct/100) * natW;
					var logoH = logoW * (state.logoNatural.h / state.logoNatural.w);
					var logoX = (state.pos.xPct/100) * natW;
					var logoY = (state.pos.yPct/100) * natH;
					ctx.save();
					ctx.translate(logoX + logoW/2, logoY + logoH/2);
					ctx.rotate(state.pos.angle * Math.PI / 180);
					ctx.drawImage(state.logoImg, -logoW/2, -logoH/2, logoW, logoH);
					ctx.restore();
					try {
						var url = canvas.toDataURL('image/png');
						var a = document.createElement('a');
						a.href = url;
						a.download = 'vista-previa-logo.png';
						document.body.appendChild(a);
						a.click();
						a.remove();
					} catch(err) {
						alert('No se pudo generar la descarga. Intenta con otra imagen de logo.');
					}
				};
				baseImg.src = prodImgSrc;
			});

			applyPos();
		}

		root.innerHTML = '<p style="text-align:center;padding:40px;color:#888;">Cargando productos...</p>';
		fetch('/wp-json/wc/store/v1/products?per_page=100&status=publish')
			.then(function(r) { return r.json(); })
			.then(function(data) {
				var decodeEl = document.createElement('textarea');
				function decodeEntities(str) {
					decodeEl.innerHTML = str;
					return decodeEl.value;
				}
				state.products = data.filter(function(p){ return p.images && p.images.length > 0; }).map(function(p) {
					p.name = decodeEntities(p.name);
					return p;
				});
				renderGrid();
			})
			.catch(function() {
				root.innerHTML = '<p style="text-align:center;padding:40px;color:#888;">No se pudieron cargar los productos.</p>';
			});
	});
})();