'use strict';
(function($){
  if (typeof window === 'undefined') return;
  var CFG = (window.KNSDD_MsgReloc || {});
  if (!CFG.force) return; // sadece force açıkken çalış

  // Paylaşımlı yardımcılar: varsa global utils'i kullan, yoksa yerel tanımlara düş
  var U = window.KNSDD_Utils;
  if(!U) return; // utils bulunamazsa güvenli çıkış
  var ready = U.ready;
  var debounce = U.debounce;
  var qsAny = U.qsAny;
  var qsaAny = U.qsaAny;
  var getPriceNode = U.getPriceNode;
  var isInDisallowed = U.isInDisallowed;
  var isVisible = U.isVisible;
  var formMatchesProduct = U.formMatchesProduct;
  var getProductId = U.getProductId;
  var uniqNodes = U.uniqNodes;
  var lastBefore = U.lastBefore;

  

  // Son güvenlik: .e-con-inner altında kalırsa doğru kolona taşı
  function fixRowPlacement(container, productRoot){
    try{
      if(!container || !container.parentElement) return false;
      var row = container.parentElement;
      if(!isRowWrapper(row) || row === productRoot) return false;
      // Fiyat ve formu satır içinde ara
      var priceInRow = qsAny(CFG.selectors && CFG.selectors.price, row);
      var formInRow  = qsAny(CFG.selectors && CFG.selectors.form, row);
      var col = null;
      if(priceInRow){ col = priceInRow.closest && priceInRow.closest('.elementor-element.e-con.e-child, .e-con.e-child, .elementor-column'); }
      if(!col && formInRow){ col = formInRow.closest && formInRow.closest('.elementor-element.e-con.e-child, .e-con.e-child, .elementor-column'); }
      if(!col){
        // İlk çocuk kolon
        for(var i=0;i<row.children.length;i++){ var ch=row.children[i]; try{ if(ch.matches && ch.matches('.elementor-element.e-con.e-child, .e-con.e-child, .elementor-column')){ col=ch; break; } }catch(_){ } }
      }
      if(!col) return false;
      // Kolona taşı: fiyat bulunursa fiyatın üstüne, yoksa başa
      if(priceInRow && col.contains(priceInRow)){
        col.insertBefore(container, priceInRow);
      } else {
        col.insertBefore(container, col.firstChild || null);
      }
      return true;
    }catch(_){ return false; }
  }

  // Elementor çocuk kolonunu (veya summary) manuel gezinerek bul
  function getElemCol(el, productRoot){
    if(!el) return null;
    var limit = productRoot || document.body;
    var node = el;
    while(node && node !== limit){
      try{
        var cl = node.classList;
        if(cl && cl.contains('e-con') && cl.contains('e-child')) return node;
        if(node.matches && node.matches('.elementor-column, .summary, .entry-summary, [class*="summary"]')) return node;
      }catch(_){ }
      node = node.parentElement;
    }
    return null;
  }

  // Hedefe göre doğru kolon host'unu bul (önce gerçek kolon, yoksa o kolonu barındıran row'un doğru çocuğu)
  function findHostForTarget(target, formEl, productRoot){
    try{
      if(!target) return productRoot || document.body;
      var col = target.closest ? target.closest('.elementor-element.e-con.e-child, .e-con.e-child, .summary, .entry-summary, [class*="summary"], .elementor-column') : null;
      if(col) return col;
      var row = target.closest ? target.closest('.e-con-inner, .elementor-container, .elementor-section') : null;
      if(row){
        if(formEl){
          for(var i=0;i<row.children.length;i++){ var ch=row.children[i]; try{ if(ch.contains(formEl)) return ch; }catch(_){ } }
        }
        for(var j=0;j<row.children.length;j++){ var c=row.children[j]; try{ if(c.contains(target)) return c; }catch(_){ } }
        return row;
      }
    }catch(_){ }
    return productRoot || document.body;
  }

  function isRowWrapper(el){
    try{
      return !!(el && el.matches && el.matches('.e-con-inner, .elementor-container, .elementor-section, .product'));
    }catch(_){ return false; }
  }

  // Row/section gibi sarmalayıcı verildiyse, içindeki gerçek kolon çocuklardan doğru olanı seç
  function coerceToColumn(host, productRoot, preferEl1, preferEl2){
    try{
      if(!host) return host;
      if(!isRowWrapper(host) && host !== productRoot) return host;
      var pref = preferEl1 || preferEl2 || null;
      // Önce prefer edilen elemanı içeren çocuğu bul
      if(pref && host && host.children){
        for(var i=0;i<host.children.length;i++){
          var ch = host.children[i];
          try{ if(ch.contains(pref)) return ch; }catch(_){ }
        }
      }
      // Sonra bilinen kolon sınıflı ilk çocuğu bul
      if(host && host.children){
        for(var j=0;j<host.children.length;j++){
          var c = host.children[j];
          try{ if(c.matches && c.matches('.elementor-element.e-con.e-child, .e-con.e-child, .elementor-column, .summary, .entry-summary, [class*="summary"]')) return c; }catch(_){ }
        }
      }
      return host;
    }catch(_){ return host; }
  }

  // Genel kolon bulucu: önce bilinen kolon sarmalayıcılarını dene, sonra galeri tabanlı çıkarım
  function findColumnWrapper(el, productRoot){
    if(!el) return null;
    try{
      var col = el.closest('.summary, .entry-summary, [class*="summary"], .elementor-element.e-con.e-child, .e-con.e-child, .elementor-column');
      if(col) return col;
    }catch(_){ }
    return columnOfPrice(el, productRoot);
  }

  // price adayının en yakın atası içinde button varsa o atayı döndür (aynı kolon/sütun)
  function ancestorContaining(el, child, stopAt){
    if(!el || !child) return null;
    var node = el;
    while(node && node !== (stopAt||document.body)){
      try{ if(node.contains(child)) return node; }catch(_){ }
      node = node.parentElement;
    }
    return null;
  }

  

  // Ürün galeri/sol sütun belirtecini bul (tema bağımsız en yaygın sınıflar)
  function findGallery(root){
    if(!root) return null;
    try{
      var g = root.querySelector('.woocommerce-product-gallery, .images, .product-gallery, .product-images');
      return g || null;
    }catch(_){ return null; }
  }

  // price düğümünden yukarı çıkarak, galeri kapsayıcısının bulunduğu seviyenin bir ALTındaki kolonu döndür
  function columnOfPrice(priceEl, productRoot){
    if(!priceEl) return null;
    var gallery = findGallery(productRoot || document);
    var last = priceEl.parentElement;
    var node = last ? last.parentElement : null;
    while(node && node !== (productRoot||document.body)){
      try{
        if(gallery && node.contains(gallery)){
          return last || priceEl.parentElement || null; // satırın hemen altındaki kolon
        }
      }catch(_){ }
      last = node;
      node = node.parentElement;
    }
    return priceEl.parentElement || null;
  }

  function pickMainForm(pid){
    var forms = qsaAny(CFG.selectors && CFG.selectors.form, document);
    if(!forms || !forms.length) return null;
    for(var i=0;i<forms.length;i++){
      var f = forms[i];
      if(isInDisallowed(f) || !isVisible(f)) continue;
      if(formMatchesProduct(f, pid)) return f;
    }
    var main = document.querySelector('.single-product .product') || document.querySelector('.woocommerce .product');
    if(main){
      for(var j=0;j<forms.length;j++){
        var f2 = forms[j];
        if(isInDisallowed(f2) || !isVisible(f2)) continue;
        if(main.contains(f2)) return f2;
      }
    }
    for(var k=0;k<forms.length;k++){
      var f3 = forms[k];
      if(isInDisallowed(f3) || !isVisible(f3)) continue;
      return f3;
    }
    return null;
  }

  function ensureVisible(container, summaryRoot, columnRoot, productRoot, formEl){
    try{
      var cs = getComputedStyle(container);
      var rect = container.getBoundingClientRect();
      var vis = (cs.display !== 'none' && cs.visibility !== 'hidden' && rect.width > 0 && rect.height > 0);
      if(vis){ try{ container.setAttribute('data-ready','1'); }catch(_){ } return true; }
      if(summaryRoot){
        var first = summaryRoot.firstElementChild || summaryRoot.firstChild;
        if(first && first.parentNode){ first.parentNode.insertBefore(container, first); }
        cs = getComputedStyle(container); rect = container.getBoundingClientRect();
        vis = (cs.display !== 'none' && cs.visibility !== 'hidden' && rect.width > 0 && rect.height > 0);
        if(vis){ try{ container.setAttribute('data-ready','1'); }catch(_){ } return true; }
      }
      if(columnRoot){
        try{ columnRoot.insertBefore(container, columnRoot.firstChild || null); }catch(_){ }
        cs = getComputedStyle(container); rect = container.getBoundingClientRect();
        vis = (cs.display !== 'none' && cs.visibility !== 'hidden' && rect.width > 0 && rect.height > 0);
        if(vis){ try{ container.setAttribute('data-ready','1'); }catch(_){ } return true; }
      }
      try{
        var node = formEl;
        while(node && node !== productRoot && node !== columnRoot){
          var parent = node.parentElement; if(!parent) break;
          // Satır/row sarmalayıcıların önüne taşımayı durdur
          if(isRowWrapper(parent)) break;
          parent.insertBefore(container, node);
          cs = getComputedStyle(container); rect = container.getBoundingClientRect();
          vis = (cs.display !== 'none' && cs.visibility !== 'hidden' && rect.width > 0 && rect.height > 0);
          if(vis){ try{ container.setAttribute('data-ready','1'); }catch(_){ } return true; }
          node = parent;
        }
      }catch(_){ }
      // productRoot tepesine taşımayı atla; kök seviyede iki sütun arası bozulur
    } catch(_e){ }
    return false;
  }

  function ensureContainer(){
    var el = document.querySelector('.knsdd-product-promo');
    if(el) return el;
    var pid = getProductId();
    if(!pid) return null;
    try{
      var id = 'knsdd-promo-' + pid + '-' + Math.random().toString(36).slice(2);
      var node = document.createElement('div');
      node.className = 'knsdd-product-promo';
      node.id = id;
      node.setAttribute('data-product-id', String(pid));
      // İlk anda kesin gizli (CSS yüklenmeden önce bile)
      try{ node.style.display = 'none'; }catch(_){ }
      document.body.appendChild(node);
      try{ document.dispatchEvent(new CustomEvent('knsdd:promo-container-added', { detail: { el: node, productId: pid } })); }catch(_){ }
      return node;
    }catch(_err){ return null; }
  }

  function moveContainer(){
    try{
      var container = document.querySelector('.knsdd-product-promo') || ensureContainer();
      if(!container) return false;
      // Sabit konteyner: taşımayı bırak
      if(container.hasAttribute('data-fixed')) return true;
      var location = (CFG.location||'auto');
      var pid = getProductId();
      // Doğru ana formu bul
      var formEl = pickMainForm(pid) || qsAny(CFG.selectors && CFG.selectors.form) || null;
      var productRoot = (formEl && formEl.closest) ? formEl.closest('.product') : null;
      if(!productRoot){ productRoot = document.querySelector('.single-product .product') || document.querySelector('.woocommerce .product') || document.querySelector('.product'); }
      var scope = productRoot || document;
      var priceEl = qsAny(CFG.selectors && CFG.selectors.price, scope) || qsAny(CFG.selectors && CFG.selectors.price);
      // Form ve buton, önce scope içinde; bulunamazsa tüm dokümanda
      formEl  = formEl || qsAny(CFG.selectors && CFG.selectors.form, scope)  || qsAny(CFG.selectors && CFG.selectors.form);
      var btnEl   = qsAny(CFG.selectors && CFG.selectors.button, scope)|| qsAny(CFG.selectors && CFG.selectors.button);

      function placeBefore(node, target){ if(!node||!target||!target.parentNode) return; if(node===target) return; target.parentNode.insertBefore(node, target); }
      function placeAfter(node, target){ if(!node||!target||!target.parentNode) return; if(node===target) return; target.parentNode.insertBefore(node, target.nextSibling); }
      function showNow(node){
        try{
          if(node.getAttribute('data-content-ready') !== '1'){
            var onReady = function(ev){ try{ if(ev && ev.detail && ev.detail.el === node){ node.setAttribute('data-ready','1'); node.style.removeProperty('display'); document.removeEventListener('knsdd:promo-content-ready', onReady); } }catch(_){ } };
            document.addEventListener('knsdd:promo-content-ready', onReady);
            return;
          }
          node.setAttribute('data-ready','1');
          node.style.removeProperty('display');
        }catch(_){ }
      }
      function insertBeforeWithinHost(node, host, target){
        try{
          if(!node || !host || !target) return;
          if(host.contains(target)){
            var anchor = target;
            while(anchor && anchor.parentNode && anchor.parentNode !== host){ anchor = anchor.parentElement; }
            if(anchor && anchor.parentNode === host){
              // Eğer host bir row/section ise (e-con-inner vs), doğrudan kolon çocuğuna girip orada ekle
              if(isRowWrapper(host)){
                var colChild = anchor; // host altındaki, target'ı taşıyan kolon çocuğu
                // Kolon içinde, target'ın en yakın doğrudan çocuğunu bul
                var anchor2 = target;
                while(anchor2 && anchor2.parentNode && anchor2.parentNode !== colChild){ anchor2 = anchor2.parentElement; }
                if(anchor2 && anchor2.parentNode === colChild){ colChild.insertBefore(node, anchor2); return; }
                // fallback: kolonun başına ekle
                colChild.insertBefore(node, colChild.firstChild || null); return;
              }
              // host zaten kolon ise, target'ı taşıyan doğrudan çocuk düğümün önüne ekle
              host.insertBefore(node, anchor); return;
            }
          }
          // fallback: host başına ekle (host kolon olmalı)
          host.insertBefore(node, host.firstChild || null);
        }catch(_){ }
      }

      if(location === 'price_above'){
        // 1) Adayları topla ve normalize et
        var raw = qsaAny(CFG.selectors && CFG.selectors.price, scope);
        var normalized = uniqNodes(raw.map(getPriceNode));
        var summaryRoot = null;
        try{
          summaryRoot = (productRoot && (productRoot.querySelector('.summary, .entry-summary') || productRoot.querySelector('[class*="summary"]')) ) || null;
        }catch(_){ summaryRoot = (productRoot && productRoot.querySelector('.summary, .entry-summary')) || null; }
        // Aynı kolon/kapsam: form.cart hangi kolon içindeyse, o kolon içindeki fiyatları tercih et
        var colSel = '.summary, .entry-summary, [class*="summary"], .elementor-element.e-con.e-child, .e-con.e-child, .elementor-column';
        var formCol = null;
        try{ if(formEl && formEl.closest){ formCol = formEl.closest(colSel); } }catch(_){ }
        // Türetilmiş kolonlar (Elementor çocuk kolonu > summary)
        var firstPrice = normalized && normalized.length ? normalized[0] : null;
        var hostCol = getElemCol(formEl, productRoot) || getElemCol(btnEl, productRoot) || getElemCol(firstPrice, productRoot) || summaryRoot || formCol || null;
        hostCol = coerceToColumn(hostCol, productRoot, formEl, firstPrice);
        // 2) Ön yerleştirme kaldırıldı: flicker riskini azaltmak için ara konuma taşımıyoruz
        // 3) Adayları aynı kolonda sınırla: öncelik hostCol, sonra summaryRoot
        var candidates = normalized.filter(function(n){
          try{
            if(isInDisallowed(n)) return false;
            // Sepet formunun İÇİNDEKİ fiyatları hariç tut (buton/quantity çevresi vb.)
            try{ if(formEl && formEl.contains(n)) return false; }catch(_){ }
            try{ if(n.closest && n.closest('form.cart')) return false; }catch(_){ }
            try{ if(btnEl && (n === btnEl || (n.closest && n.closest('.single_add_to_cart_button')))) return false; }catch(_){ }
            if(hostCol){
              var h1 = getElemCol(n, productRoot);
              if(h1) return h1 === hostCol;
            }
            if(summaryRoot) return summaryRoot.contains(n);
            return true;
          }catch(_){ return false; }
        });
        // 4) Hedef seçimi: formdan önce gelen en son fiyat; yoksa ilk aday
        var target = null;
        if(candidates && candidates.length){
          target = formEl ? (lastBefore(candidates, formEl) || candidates[0]) : candidates[0];
        }
        if(target){
          // Öncelik: fiyatın Elementor sütunu ve fiyat widget'ının hemen üstü
          try{
            var priceWidget = target.closest ? target.closest('.elementor-element.elementor-widget-woocommerce-product-price, [data-widget_type="woocommerce-product-price.default"]') : null;
            var elemCol = target.closest ? target.closest('.elementor-element.e-con.e-child, .e-con.e-child, .elementor-column') : null;
            if(elemCol && priceWidget && elemCol.contains(priceWidget)){
              if(!elemCol.contains(container)) elemCol.insertBefore(container, priceWidget);
              showNow(container);
              return true;
            }
          }catch(_){ }
          // Hızlı yol: fiyat BLOĞUNUN (closest .price) dışına, hemen üstüne yerleştir
          try{
            var priceBlock = (target.closest && target.closest('.price')) || target;
            var hostOfPrice = priceBlock.parentNode;
            if(hostOfPrice && hostOfPrice.nodeType===1){ hostOfPrice.insertBefore(container, priceBlock); showNow(container); return true; }
          }catch(_){ }
          // Ebeveynin aynı kolon olduğundan emin ol ve eklemeyi host içinde yap
          var host = hostCol || findHostForTarget(target, formEl, productRoot);
          host = coerceToColumn(host, productRoot, formEl, target);
          if(host && host !== productRoot){ insertBeforeWithinHost(container, host, target); }
          fixRowPlacement(container, productRoot);
          showNow(container);
          return true;
        }
        
        // 4.1) Price fallback: hostCol/summaryRoot içinde görünür bir fiyat bulun ve onun üstüne yerleştir
        if(!target){
          try{
            var selStr = (CFG.selectors && CFG.selectors.price) || '.price, .woocommerce-Price-amount, .amount';
            var pools = [];
            if(hostCol) pools.push(hostCol);
            if(summaryRoot && (!hostCol || summaryRoot !== hostCol)) pools.push(summaryRoot);
            pools.push(scope);
            var priceCandidate = null;
            for(var pr=0; pr<pools.length && !priceCandidate; pr++){
              var prRoot = pools[pr];
              var list = [];
              try{ list = [].slice.call(prRoot.querySelectorAll(selStr)); }catch(_){ }
              if(list && list.length){
                list = list.map(getPriceNode).filter(function(n){ return !isInDisallowed(n) && isVisible(n); });
                if(list && list.length){ priceCandidate = formEl ? (lastBefore(list, formEl) || list[0]) : list[0]; }
              }
            }
            if(priceCandidate){
              // Hızlı yol: fiyat BLOĞUNUN (closest .price) dışına, hemen üstüne yerleştir
              try{
                var priceBlock2 = (priceCandidate.closest && priceCandidate.closest('.price')) || priceCandidate;
                var hostP = priceBlock2.parentNode;
                if(hostP && hostP.nodeType===1){ hostP.insertBefore(container, priceBlock2); showNow(container); return true; }
              }catch(_){ }
              var host2 = hostCol || findHostForTarget(priceCandidate, formEl, productRoot);
              host2 = coerceToColumn(host2, productRoot, formEl, priceCandidate);
              if(host2 && host2 !== productRoot){ insertBeforeWithinHost(container, host2, priceCandidate); }
              fixRowPlacement(container, productRoot);
              showNow(container);
              return true;
            }
          }catch(_){ }
        }
        // 5) Hedef bulunamazsa: price_above modunda GÖSTERME. Kısa süreli yanlış konum flicker'ını önlemek için bekle.
        // startRetries tekrar deneyecek ve fiyat bulunduğunda görünür yapılacak.
        return false;
      } else if(location === 'button_before'){
        if(formEl){ placeBefore(container, formEl); showNow(container); return true; }
        if(btnEl){ placeBefore(container, btnEl); showNow(container); return true; }
      } else if(location === 'button_after'){
        if(formEl){ placeAfter(container, formEl); showNow(container); return true; }
        if(btnEl){ placeAfter(container, btnEl); showNow(container); return true; }
      } else if(location === 'summary'){
        // Summary içinde kal: summary kökünü bul ve başına koy
        var summary = (productRoot && productRoot.querySelector('.summary, .entry-summary, .elementor-widget-woocommerce-product-price')) || document.querySelector('.product .summary, .entry-summary, .elementor-widget-woocommerce-product-price');
        if(summary){ var first2 = summary.firstElementChild || summary.firstChild; if(first2){ placeBefore(container, first2); showNow(container); return true; } }
      } else { // auto
        if(formEl){ placeBefore(container, formEl); showNow(container); return true; }
        if(priceEl){ placeBefore(container, priceEl); showNow(container); return true; }
        if(formEl){ placeAfter(container, formEl); showNow(container); return true; }
      }
      return false;
    } catch(e){ /* sessiz düş */ return false; }
  }

  var run = debounce(moveContainer, CFG.debounce || 120);

  function startRetries(){
    var attempts = 0, max = 20, interval = 250;
    var timer = setInterval(function(){
      attempts++;
      try{ ensureContainer(); if(moveContainer()){ clearInterval(timer); return; } }catch(_){ }
      if(attempts >= max){ clearInterval(timer); }
    }, interval);
  }

  ready(function(){
    // İlk anda beklemeden çalıştır: gecikme = 0
    try{ moveContainer(); }catch(_){ }
    run();
    startRetries();
    // WooCommerce varyasyon eventleri için jQuery ile dinle
    try{
      var $product = $('.product');
      var $form = $product.find('form.cart').first();
      if($form && $form.length){
        $form.on('found_variation reset_data hide_variation woocommerce_variation_has_changed change', run);
      }
    } catch(e){}

    // Elementor frontend init
    if (window.elementorFrontend && window.elementorFrontend.hooks) {
      try{ window.elementorFrontend.hooks.addAction('frontend/element_ready/global', run); } catch(_){ }
    }

    // MutationObserver: summary alanındaki yeniden yerleşimleri yakala (opsiyonel ve hafif)
    try{
      var target = document.querySelector('.product');
      if(target && 'MutationObserver' in window){
        var obs = new MutationObserver(debounce(run, CFG.debounce || 120));
        obs.observe(target, { childList:true, subtree:true });
      }
    } catch(e){}

    // Hızlı fiyat gözlemcisi: fiyat düğümü eklendiğinde anında reposition
    try{
      var priceTarget = document.querySelector('.product') || document.body;
      var priceSel = (CFG.selectors && CFG.selectors.price) || '.summary .price, .entry-summary .price, .price';
      if(priceTarget && 'MutationObserver' in window){
        var lastT = 0;
        var obsFast = new MutationObserver(function(muts){
          var now = Date.now(); if(now - lastT < 60) return; // throttle ~60ms
          for(var i=0;i<muts.length;i++){
            var m = muts[i];
            var n = m.target;
            try{
              if((n.matches && n.matches(priceSel)) || (n.querySelector && n.querySelector(priceSel))){
                lastT = now;
                moveContainer();
                break;
              }
            }catch(_){ }
            if(m.addedNodes && m.addedNodes.length){
              for(var j=0;j<m.addedNodes.length;j++){
                var a = m.addedNodes[j];
                try{
                  if((a.matches && a.matches(priceSel)) || (a.querySelector && a.querySelector(priceSel))){
                    lastT = now;
                    moveContainer();
                    i = muts.length; break;
                  }
                }catch(_){ }
              }
            }
          }
        });
        obsFast.observe(priceTarget, { childList:true, subtree:true, attributes:true, characterData:true });
      }
    }catch(_e){}
  });
})(window.jQuery);
