/**
 * service-wizards.js — فرم‌های تفکیک‌شده الگوریتم خدمات (Spec A)
 */
;(function (global) {
    'use strict';

    const API = () => (global.ACC_CHAT_CFG?.api_base || '/acc-engine/api.php/acc/v1').replace(/\/$/, '');

    async function fetchFields(type) {
        try {
            const r = await fetch(`${API()}/service/visitor/wizard-config?service_type=${encodeURIComponent(type)}`);
            const text = await r.text();
            let j;
            try { j = JSON.parse(text); } catch { throw new Error('پاسخ نامعتبر از سرور'); }
            if (!r.ok) throw new Error(j.message || 'خطا در دریافت فرم');
            if (Array.isArray(j.fields) && j.fields.length) return j.fields;
        } catch (e) {
            console.warn('[SvcWizards] fetchFields fallback:', e);
        }
        return FALLBACK_FIELDS[type] || FALLBACK_FIELDS._default;
    }

    const FALLBACK_FIELDS = {
        _default: [
            { key: 'name', label: 'نام *', type: 'text', required: true },
            { key: 'phone', label: 'موبایل *', type: 'tel', required: true, dir: 'ltr' },
            { key: 'site_label', label: 'موضع / آدرس *', type: 'text', required: true },
            { key: 'complaint_text', label: 'شرح *', type: 'textarea', required: true },
        ],
        phone_consult: [
            { key: 'name', label: 'نام *', type: 'text', required: true },
            { key: 'phone', label: 'موبایل *', type: 'tel', required: true, dir: 'ltr' },
            { key: 'site_label', label: 'موضع / آدرس *', type: 'text', required: true },
            { key: 'device_type', label: 'نوع دستگاه', type: 'select', options: ['چیلر', 'سردخانه', 'ویترین', 'هواساز', 'داکت اسپلیت', 'روفتاپ', 'سایر'] },
            { key: 'brand', label: 'برند', type: 'text' },
            { key: 'complaint_text', label: 'شرح مشکل *', type: 'textarea', required: true },
        ],
        repair: [
            { key: 'name', label: 'نام *', type: 'text', required: true },
            { key: 'phone', label: 'موبایل *', type: 'tel', required: true, dir: 'ltr' },
            { key: 'site_label', label: 'موضع / آدرس *', type: 'text', required: true },
            { key: 'priority', label: 'اولویت *', type: 'select', required: true, options: { normal: 'عادی', urgent: 'اضطراری' } },
            { key: 'complaint_text', label: 'شرح مشکل *', type: 'textarea', required: true },
        ],
    };

    async function analyze(payload) {
        const r = await fetch(`${API()}/service/visitor/analyze`, {
            method: 'POST', headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(payload),
        });
        return r.json();
    }

    async function partsQuote(payload) {
        const r = await fetch(`${API()}/service/visitor/parts-quote`, {
            method: 'POST', headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(payload),
        });
        return r.json();
    }

    function esc(s) {
        return String(s ?? '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
    }

    function fieldHtml(f) {
        const id = `cw-w-${f.key}`;
        const req = f.required ? ' required' : '';
        const dir = f.dir ? ` dir="${f.dir}"` : '';
        if (f.type === 'textarea') {
            return `<label class="cw-wiz-lbl">${esc(f.label)}</label><textarea class="cw-visitor-input" id="${id}" data-key="${f.key}" rows="3"${req}></textarea>`;
        }
        if (f.type === 'select') {
            const opts = f.options || {};
            const entries = Array.isArray(opts) ? opts.map(v => [v, v]) : Object.entries(opts);
            return `<label class="cw-wiz-lbl">${esc(f.label)}</label><select class="cw-visitor-input" id="${id}" data-key="${f.key}"${req}>${entries.map(([k, v]) => `<option value="${esc(k)}">${esc(v)}</option>`).join('')}</select>`;
        }
        const type = f.type === 'tel' ? 'tel' : (f.type === 'number' ? 'number' : 'text');
        return `<label class="cw-wiz-lbl">${esc(f.label)}</label><input class="cw-visitor-input" id="${id}" data-key="${f.key}" type="${type}"${dir}${req}>`;
    }

    function collectPayload(root, serviceType) {
        const payload = { service_type: serviceType };
        root.querySelectorAll('[data-key]').forEach(el => {
            payload[el.dataset.key] = el.value?.trim?.() ?? el.value;
        });
        return payload;
    }

    const ROUTES = [
        { key: 'phone_consult', icon: '📞', title: 'مشاوره فنی' },
        { key: 'repair', icon: '🛠', title: 'تعمیر و سرویس' },
        { key: 'pm', icon: '📅', title: 'نگهداری PM' },
        { key: 'parts_supply', icon: '🔩', title: 'تأمین قطعات' },
        { key: 'equipment_purchase', icon: '🏭', title: 'خرید تجهیزات' },
        { key: 'site_visit', icon: '🔍', title: 'بازدید کارشناس' },
        { key: 'contract_support', icon: '📋', title: 'پشتیبانی قراردادی' },
    ];

    global.SvcWizards = {
        ROUTES,
        fetchFields,
        analyze,
        partsQuote,
        fieldHtml,
        collectPayload,
        async renderWizard(container, serviceType, serviceTitle, serviceIcon, onBack, onSubmit) {
            const fields = await fetchFields(serviceType);
            container.innerHTML = `
                <button class="cw-back-btn" id="cw-wiz-back">◀ بازگشت</button>
                <div class="cw-section-title">${serviceIcon || '🔧'} ${esc(serviceTitle)}</div>
                <div id="cw-wiz-fields">${fields.map(fieldHtml).join('')}</div>
                <div id="cw-wiz-preview" class="cw-wiz-preview" style="display:none"></div>
                <button class="cw-start-btn" id="cw-w-submit">✅ ثبت درخواست</button>`;

            container.querySelector('#cw-wiz-back')?.addEventListener('click', onBack);

            const preview = container.querySelector('#cw-wiz-preview');
            const showPreview = (html) => { if (preview) { preview.style.display = 'block'; preview.innerHTML = html; } };

            if (['phone_consult', 'online_consult', 'troubleshooting'].includes(serviceType)) {
                const btn = document.createElement('button');
                btn.className = 'cw-btn-secondary';
                btn.textContent = '🔍 تحلیل اولیه';
                btn.style.marginTop = '8px';
                btn.addEventListener('click', async () => {
                    const payload = collectPayload(container, serviceType);
                    const res = await analyze(payload);
                    const d = res.data || {};
                    const probs = (d.probabilities || []).map(p =>
                        `<li><b>${esc(p.pct)}٪</b> — ${esc(p.cause)} <small>(${esc(p.action || '')})</small></li>`
                    ).join('');
                    showPreview(`<div class="cw-analyze"><strong>نتیجه تحلیل:</strong><ul>${(d.tips || []).map(t => `<li>${esc(t)}</li>`).join('')}</ul>
                        ${probs ? `<p><strong>احتمالات علت:</strong></p><ul>${probs}</ul>` : ''}
                        ${d.cost_estimate ? `<p>تخمین هزینه: ${Number(d.cost_estimate).toLocaleString('fa-IR')} تومان</p>` : ''}
                        ${d.payment_hint ? `<p class="cw-hint">${esc(d.payment_hint)}</p>` : ''}
                        ${(d.missing_fields || []).length ? `<p class="cw-warn">فیلدهای ناقص: ${d.missing_fields.join('، ')}</p>` : ''}</div>`);
                });
                container.querySelector('#cw-wiz-fields')?.after(btn);
            }

            if (serviceType === 'parts_supply') {
                const btn = document.createElement('button');
                btn.className = 'cw-btn-secondary';
                btn.textContent = '💰 استعلام موجودی';
                btn.style.marginTop = '8px';
                btn.addEventListener('click', async () => {
                    const payload = collectPayload(container, serviceType);
                    const res = await partsQuote(payload);
                    const q = res.data || {};
                    const rows = (q.suppliers || []).map(s =>
                        `<tr><td>${esc(s.supplier_name)}</td><td>${Number(s.unit_price || s.price || 0).toLocaleString('fa-IR')}</td>
                        <td>${esc(s.warranty_months || '—')} ماه</td><td>${esc(s.lead_days)} روز</td>
                        <td>${esc(s.rating || '—')}</td></tr>`
                    ).join('');
                    showPreview(`<div class="cw-analyze"><strong>${esc(q.message || '')}</strong>
                        ${q.price ? `<p>بهترین قیمت: ${Number(q.price).toLocaleString('fa-IR')}</p>` : ''}
                        ${q.eta_days && !q.in_stock ? `<p>زمان تحویل: ${q.eta_days} روز — پیش‌پرداخت ${q.deposit_pct || 30}٪</p>` : ''}
                        ${rows ? `<table class="cw-sup-table"><thead><tr><th>تأمین‌کننده</th><th>قیمت</th><th>گارانتی</th><th>تحویل</th><th>امتیاز</th></tr></thead><tbody>${rows}</tbody></table>` : ''}</div>`);
                });
                container.querySelector('#cw-wiz-fields')?.after(btn);
            }

            container.querySelector('#cw-w-submit')?.addEventListener('click', async () => {
                const payload = collectPayload(container, serviceType);
                await onSubmit(payload);
            });
        },
    };
})(typeof window !== 'undefined' ? window : globalThis);
