
<script>
(function () {
    if (window.__pqvCrudInit) return;
    window.__pqvCrudInit = true;

    const PQV = window.PQV = {
        csrf: () => document.querySelector('meta[name="csrf-token"]')?.content || '',
        toast: (msg, icon = 'success') => {
            if (typeof Swal === 'undefined') return;
            Swal.mixin({ toast: true, position: 'top-end', showConfirmButton: false, timer: 2200, timerProgressBar: true })
                .fire({ icon, title: msg || (icon === 'success' ? 'İşlem tamam' : 'Hata') });
        },
        reload: (tab, el) => {
            let url = null;
            if (el) {
                const card = el.closest('.qv-card-wrapper');
                const m = card && card.querySelector('[data-pqv-selfurl]');
                if (m) url = m.getAttribute('data-pqv-selfurl');
            }
            if (!url) { try { if (typeof activeQuickViewUrl !== 'undefined' && activeQuickViewUrl) url = activeQuickViewUrl; } catch (e) {} }
            if (url && typeof openQuickView === 'function') openQuickView(url, tab || null);
        },
        send: (url, method, body, json = true) => fetch(url, {
            method,
            headers: Object.assign(
                { 'X-CSRF-TOKEN': PQV.csrf(), 'Accept': 'application/json' },
                json && body ? { 'Content-Type': 'application/json' } : {}
            ),
            body: body ? (json ? JSON.stringify(body) : body) : undefined,
        }).then(async r => { let d = {}; try { d = await r.json(); } catch (e) {} return { ok: r.ok, status: r.status, data: d }; }),
        formToObj: (form) => {
            const obj = {};
            new FormData(form).forEach((v, k) => {
                // Dizi ekleme: name[]
                if (k.endsWith('[]')) { const kk = k.slice(0, -2); (obj[kk] = obj[kk] || []).push(v); return; }
                // İç içe anahtarlar SINIRSIZ derinlikte: name[k1][k2][k3]...
                // (ör. marketplace_prices[5][none][adult_price] — pazaryeri × sınıf matrisi 4 segment)
                const m = k.match(/^([^\[]+)((?:\[[^\]]+\])+)$/);
                if (m) {
                    const keys = [m[1], ...m[2].match(/\[([^\]]+)\]/g).map(s => s.slice(1, -1))];
                    let cur = obj;
                    for (let i = 0; i < keys.length - 1; i++) {
                        if (!cur[keys[i]] || typeof cur[keys[i]] !== 'object') cur[keys[i]] = {};
                        cur = cur[keys[i]];
                    }
                    cur[keys[keys.length - 1]] = v;
                    return;
                }
                obj[k] = v;
            });
            return obj;
        },
    };

    // ── Aç/kapa (inline form göster/gizle) ──
    document.addEventListener('click', function (e) {
        const t = e.target.closest('[data-pqv-toggle]');
        if (!t) return;
        e.preventDefault();
        const card = t.closest('.qv-card-wrapper') || document;
        const tgt = card.querySelector(t.dataset.pqvToggle);
        if (tgt) tgt.classList.toggle('open');
    });

    // ── Genel kaydet formu (ekle/düzenle) ──
    document.addEventListener('submit', function (e) {
        const form = e.target.closest('form[data-pqv-save]');
        if (!form) return;
        e.preventDefault();
        // data-alt-when seçicisi işaretliyse action yerine data-alt-action'a gönder (ör. seri tarih → bulk endpoint)
        const alt = form.dataset.altWhen && form.querySelector(form.dataset.altWhen);
        const url = (alt && alt.checked && form.dataset.altAction) ? form.dataset.altAction : form.getAttribute('action');
        const method = (form.dataset.method || 'POST').toUpperCase();
        const tab = form.dataset.reloadTab;
        const btn = form.querySelector('[type="submit"]');
        const orig = btn ? btn.innerHTML : '';
        if (btn) { btn.disabled = true; btn.innerHTML = '<i class="fas fa-spinner fa-spin"></i>'; }
        PQV.send(url, method, PQV.formToObj(form)).then(res => {
            if (res.data.success !== false && res.ok) {
                PQV.toast(res.data.message || 'Kaydedildi');
                if (tab) PQV.reload(tab, form);
                else if (btn) { btn.disabled = false; btn.innerHTML = orig; }
            } else {
                let msg = res.data.message || 'Kayıt başarısız.';
                if (res.data.errors) msg = Object.values(res.data.errors).flat().join(' ');
                PQV.toast(msg, 'error');
                if (btn) { btn.disabled = false; btn.innerHTML = orig; }
            }
        });
    });

    // ── Dosya yükleme (multipart) ──
    document.addEventListener('submit', function (e) {
        const form = e.target.closest('form[data-pqv-upload]');
        if (!form) return;
        e.preventDefault();
        const tab = form.dataset.reloadTab;
        const btn = form.querySelector('[type="submit"]');
        const orig = btn ? btn.innerHTML : '';
        if (btn) { btn.disabled = true; btn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Yükleniyor…'; }
        PQV.send(form.getAttribute('action'), 'POST', new FormData(form), false).then(res => {
            if (res.data.success !== false && res.ok) { PQV.toast(res.data.message || 'Yüklendi'); if (tab) PQV.reload(tab, form); }
            else {
                let msg = res.data.message || 'Yükleme başarısız.';
                if (res.data.errors) msg = Object.values(res.data.errors).flat().join(' ');
                PQV.toast(msg, 'error');
                if (btn) { btn.disabled = false; btn.innerHTML = orig; }
            }
        });
    });

    // ── Silme ──
    document.addEventListener('click', function (e) {
        const el = e.target.closest('[data-pqv-delete]');
        if (!el) return;
        e.preventDefault();
        const run = () => PQV.send(el.dataset.pqvDelete, 'DELETE').then(res => {
            if (res.data.success !== false && res.ok) { PQV.toast(res.data.message || 'Silindi'); PQV.reload(el.dataset.reloadTab, el); }
            else PQV.toast(res.data.message || 'Silinemedi', 'error');
        });
        if (typeof Swal !== 'undefined') {
            Swal.fire({ title: 'Emin misiniz?', text: 'Bu kayıt silinecek.', icon: 'warning', showCancelButton: true, confirmButtonColor: '#ef4444', confirmButtonText: 'Evet, sil', cancelButtonText: 'Vazgeç' })
                .then(r => r.isConfirmed && run());
        } else if (confirm('Silinsin mi?')) run();
    });

    // ── Basit POST aksiyonu (toggle / varsayılan yap) ──
    document.addEventListener('click', function (e) {
        const el = e.target.closest('[data-pqv-post]');
        if (!el) return;
        e.preventDefault();
        PQV.send(el.dataset.pqvPost, 'POST', {}).then(res => {
            if (res.data.success !== false && res.ok) { PQV.toast(res.data.message || 'Güncellendi'); PQV.reload(el.dataset.reloadTab, el); }
            else PQV.toast(res.data.message || 'İşlem başarısız', 'error');
        });
    });

    // ── Araç atama (select change) ──
    document.addEventListener('change', function (e) {
        const sel = e.target.closest('select[data-pqv-vehicle]');
        if (!sel) return;
        PQV.send(sel.dataset.pqvVehicle, 'POST', { vehicle_id: sel.value || null }).then(res => {
            PQV.toast(res.data.message || (res.ok ? 'Araç atandı' : 'Hata'), res.ok ? 'success' : 'error');
        });
    });

    // ── Tarih üret (günübirlik, çakışma onayı ile) ──
    document.addEventListener('submit', function (e) {
        const form = e.target.closest('form[data-pqv-generate]');
        if (!form) return;
        e.preventDefault();
        const url = form.getAttribute('action');
        const tab = form.dataset.reloadTab;
        const body = PQV.formToObj(form);
        // Kullanıcı formda bir aksiyon seçtiyse onu koru; seçmediyse onaydan sonra güvenli varsayılana düş.
        const confirmed = () => ({ action: body.action || 'skip', outdated_action: body.outdated_action || 'keep' });
        const finalize = (extra) => PQV.send(url, 'POST', Object.assign({}, body, extra || {})).then(res => {
            if (res.data.needs_confirmation) {
                if (typeof Swal !== 'undefined') {
                    Swal.fire({ title: 'Çakışan tarihler var', text: res.data.message || 'Mevcut tarihler atlanıp eskiler korunsun mu?', icon: 'question', showCancelButton: true, confirmButtonText: 'Devam et', cancelButtonText: 'Vazgeç' })
                        .then(r => { if (r.isConfirmed) finalize(confirmed()); });
                } else if (confirm('Çakışan tarihler var. Devam edilsin mi?')) {
                    finalize(confirmed());
                }
                return;
            }
            if (res.data.success !== false && res.ok) { PQV.toast(res.data.message || 'Tarihler oluşturuldu'); if (tab) PQV.reload(tab, form); }
            else PQV.toast(res.data.message || 'Tarih oluşturulamadı', 'error');
        });
        finalize();
    });

    // ── Pazaryeri senkronizasyonu (checkbox) ──
    // Seçim anında kaydedilir; kısa bir beklemeden sonra quick-view yeniden yüklenir ki
    // Fiyatlandırma/Tarihler sekmelerindeki pazaryeri fiyat matrisleri güncel pazaryeri
    // setine göre (sunucu tarafında) yeniden çizilsin.
    let pqvMpReloadT = null;
    function pqvPanelTab(el) {
        const panel = el.closest('.qv-tab-panel');
        return (panel && panel.id) ? panel.id.replace(/^qv-tab-/, '') : null;
    }
    function pqvMpPayload(wrap) {
        return {
            marketplaces: Array.from(wrap.querySelectorAll('[data-pqv-mp]:checked')).map(c => parseInt(c.value)),
            primary_marketplace_id: parseInt(wrap.dataset.pqvMpPrimaryid) || null,
        };
    }
    function pqvMpSync(wrap, srcEl) {
        const tab = pqvPanelTab(srcEl);
        PQV.send(wrap.dataset.pqvMpSync, 'POST', pqvMpPayload(wrap)).then(res => {
            PQV.toast(res.data.message || (res.ok ? 'Güncellendi' : 'Hata'), res.ok ? 'success' : 'error');
            // Hızlı ardışık seçimlerde tek yenileme: son değişimden ~700ms sonra
            if (res.ok && typeof PQV.reload === 'function') {
                clearTimeout(pqvMpReloadT);
                pqvMpReloadT = setTimeout(() => PQV.reload(tab, srcEl), 700);
            }
        });
    }
    document.addEventListener('change', function (e) {
        const cb = e.target.closest('[data-pqv-mp]');
        if (!cb) return;
        const wrap = cb.closest('[data-pqv-mp-sync]');
        if (!wrap) return;
        pqvMpSync(wrap, cb);
    });
    // Ana pazar seçimi (yıldız): checkbox'ı toggle'lamadan primary'yi değiştirir
    document.addEventListener('click', function (e) {
        const star = e.target.closest('[data-pqv-mp-primary]');
        if (!star) return;
        e.preventDefault();
        const wrap = star.closest('[data-pqv-mp-sync]');
        if (!wrap) return;
        const id = parseInt(star.dataset.pqvMpPrimary);
        // Ana pazar seçilen pazaryeri listede işaretli olmalı
        const cb = wrap.querySelector('[data-pqv-mp][value="' + id + '"]');
        if (cb && !cb.checked) cb.checked = true;
        wrap.dataset.pqvMpPrimaryid = id;
        // Görsel durum (reload'a kadar anlık geri bildirim)
        wrap.querySelectorAll('.pqv-mp-card').forEach(card => {
            const isThis = card.querySelector('[data-pqv-mp-primary]') === star;
            card.classList.toggle('is-primary-mp', isThis);
            const ic = card.querySelector('.pqv-mp-star i');
            if (ic) ic.className = (isThis ? 'fas' : 'far') + ' fa-star';
        });
        pqvMpSync(wrap, star);
    });

    // ── Çeviriler: pazar/dil seçimi → fetch → formu doldur ──
    function pqvTransContext(el) { return el.closest('[data-pqv-trans]'); }
    function pqvPopulateLanguages(ctx) {
        const mpSel = ctx.querySelector('[data-pqv-trans-mp]');
        const langSel = ctx.querySelector('[data-pqv-trans-lang]');
        if (!mpSel || !langSel) return;
        let langs = [];
        const opt = mpSel.selectedOptions[0];
        try { langs = JSON.parse(opt?.dataset.langs || '[]'); } catch (e) {}
        langSel.innerHTML = '<option value="">Dil seçin…</option>' + langs.map(l => `<option value="${l.id}">${l.name} (${l.code})</option>`).join('');
    }
    function pqvFetchTranslation(ctx) {
        const mp = ctx.querySelector('[data-pqv-trans-mp]')?.value;
        const lang = ctx.querySelector('[data-pqv-trans-lang]')?.value;
        const form = ctx.querySelector('form[data-pqv-save]');
        if (!form) return;
        form.querySelector('[name="marketplace_id"]').value = mp || '';
        form.querySelector('[name="language_id"]').value = lang || '';
        const ws = ctx.querySelector('[data-pqv-trans-ws]');
        if (!mp || !lang) { if (ws) ws.style.display = 'none'; return; }
        if (ws) ws.style.display = '';
        const url = ctx.dataset.pqvTransUrl + '?marketplace_id=' + mp + '&language_id=' + lang;
        fetch(url, { headers: { 'Accept': 'application/json' } }).then(r => r.json()).then(d => {
            const t = (d && d.translation) || {};
            ['name', 'short_description', 'description', 'highlights', 'inclusions', 'exclusions', 'cancellation_policy', 'meta_title', 'meta_description'].forEach(f => {
                const inp = form.querySelector('[name="' + f + '"]');
                if (inp) inp.value = t[f] || '';
            });
        });
    }
    document.addEventListener('change', function (e) {
        const mpSel = e.target.closest('[data-pqv-trans-mp]');
        if (mpSel) { const ctx = pqvTransContext(mpSel); pqvPopulateLanguages(ctx); pqvFetchTranslation(ctx); return; }
        const langSel = e.target.closest('[data-pqv-trans-lang]');
        if (langSel) { pqvFetchTranslation(pqvTransContext(langSel)); return; }
    });
})();
</script>
<?php /**PATH C:\xampp\htdocs\acente\resources\views/agency/products/_quick-view-crud-script.blade.php ENDPATH**/ ?>