/* ============================================================
   LISTING VARIATIONS (Phase 1 — text-only, simplified)
   Shared module for vendor editor, customer selector, staff summary.
   Stored inside each listing's existing meta.jsonb as meta.variations.
   Exposes: window.SarayaVariations (helpers),
            window.VariationEditor, window.VariationSelector,
            window.VariationSummary
   ============================================================ */
(function () {
  var React = window.React;
  if (!React) { return; }
  var useState = React.useState;

  function readVariations(item) {
    if (!item) return [];
    var v = item.variations;
    if (!Array.isArray(v) && item.meta && Array.isArray(item.meta.variations)) v = item.meta.variations;
    return Array.isArray(v) ? v : [];
  }

  // selection is a map { groupIndex: optionIndex }
  function priceDelta(groups, selection) {
    var sum = 0;
    (groups || []).forEach(function (g, gi) {
      var oi = selection ? selection[gi] : undefined;
      if (oi === undefined || oi === null) return;
      var opt = (g.options || [])[oi];
      if (opt && opt.is_available !== false) {
        var pa = Number(opt.price_adjustment);
        if (!isNaN(pa)) sum += pa;
      }
    });
    return sum;
  }

  function selectionSummary(groups, selection, ar) {
    var parts = [];
    (groups || []).forEach(function (g, gi) {
      var oi = selection ? selection[gi] : undefined;
      if (oi === undefined || oi === null) return;
      var opt = (g.options || [])[oi];
      if (!opt) return;
      var gname = (ar && g.name_ar) ? g.name_ar : (g.name || g.type || '');
      var oname = (ar && opt.label_ar) ? opt.label_ar : (opt.label || opt.value || '');
      if (oname) parts.push(gname + ': ' + oname);
    });
    return parts.join(' | ');
  }

  // image_url of the last-selected option that has one (for main-image swap)
  function selectedImage(groups, selection) {
    var img = '';
    (groups || []).forEach(function (g, gi) {
      var oi = selection ? selection[gi] : undefined;
      if (oi === undefined || oi === null) return;
      var opt = (g.options || [])[oi];
      if (opt && opt.image_url) img = opt.image_url;
    });
    return img;
  }

  /* ---------- Vendor editor (simplified) ---------- */
  function VariationEditor(props) {
    var ar = props.ar;
    var groups = Array.isArray(props.value) ? props.value : [];
    var upSt = useState({});
    var uploading = upSt[0];
    var setUploading = upSt[1];
    var handleUpload = function (gi, oi) {
      return function (e) {
        var file = e.target.files && e.target.files[0];
        if (!file) return;
        if (!(window.SarayaService && window.SarayaService.storage)) { return; }
        var key = gi + '-' + oi;
        setUploading(function (u) { var n = Object.assign({}, u); n[key] = true; return n; });
        window.SarayaService.storage.uploadListingImage(props.vendorId, file, true).then(function (res) {
          if (res && res.url) { setOption(gi, oi, { image_url: res.url }); }
          setUploading(function (u) { var n = Object.assign({}, u); delete n[key]; return n; });
        }).catch(function () { setUploading(function (u) { var n = Object.assign({}, u); delete n[key]; return n; }); });
      };
    };
    var emit = function (next) { props.onChange && props.onChange(next); };
    var newOption = function () { return { label: '', label_ar: '', price_adjustment: 0, is_available: true }; };
    var newGroup = function (name) { return { name: name || '', name_ar: '', display: 'pills', options: [newOption(), newOption()] }; };
    var setGroup = function (gi, patch) { emit(groups.map(function (g, i) { return i === gi ? Object.assign({}, g, patch) : g; })); };
    var addGroup = function (name) { emit(groups.concat([newGroup(name)])); };
    var removeGroup = function (gi) { emit(groups.filter(function (_, i) { return i !== gi; })); };
    var addOption = function (gi) { setGroup(gi, { options: (groups[gi].options || []).concat([newOption()]) }); };
    var setOption = function (gi, oi, patch) { setGroup(gi, { options: (groups[gi].options || []).map(function (o, i) { return i === oi ? Object.assign({}, o, patch) : o; }) }); };
    var removeOption = function (gi, oi) { setGroup(gi, { options: (groups[gi].options || []).filter(function (_, i) { return i !== oi; }) }); };

    var inp = { padding: '8px 10px', borderRadius: 8, border: '1px solid var(--line-strong)', fontSize: 13.5, fontFamily: 'var(--font-body)', background: 'var(--white)' };
    var QUICK = ar ? [['اللون', 'Color'], ['المقاس', 'Size'], ['النمط', 'Style'], ['الباقة', 'Package']] : [['Color'], ['Size'], ['Style'], ['Package']];

    return (
      <div style={{ marginTop: 8 }}>
        <div style={{ fontSize: 12.5, color: 'var(--fg-muted)', marginBottom: 10, lineHeight: 1.5 }}>
          {ar ? 'اختياري — أضف خيارات مثل اللون أو المقاس أو الباقة. اتركها فارغة إذا لم تكن مطلوبة.' : 'Optional — add choices like colour, size, or package. Leave empty if not needed.'}
        </div>

        {groups.map(function (g, gi) {
          return (
            <div key={gi} style={{ border: '1px solid var(--line)', borderRadius: 12, padding: 12, marginBottom: 10, background: 'var(--cream)' }}>
              <div style={{ display: 'flex', gap: 8, alignItems: 'center', marginBottom: 8 }}>
                <input style={Object.assign({}, inp, { flex: '1 1 auto', fontWeight: 600 })} value={g.name || ''} placeholder={ar ? 'اسم الخيار (مثل: اللون)' : 'Option name (e.g. Color)'} onChange={function (e) { setGroup(gi, { name: e.target.value }); }} />
                <button type="button" onClick={function () { removeGroup(gi); }} title={ar ? 'حذف' : 'Remove'} style={{ border: 'none', background: 'transparent', color: 'var(--error)', cursor: 'pointer', fontSize: 13, fontWeight: 600, whiteSpace: 'nowrap' }}>{ar ? 'حذف' : 'Remove'}</button>
              </div>

              {(g.options || []).map(function (o, oi) {
                return (
                  <div key={oi} style={{ display: 'flex', gap: 6, flexWrap: 'wrap', alignItems: 'center', marginBottom: 6 }}>
                    <input style={Object.assign({}, inp, { flex: '1 1 150px' })} value={o.label || ''} placeholder={ar ? ('الخيار ' + (oi + 1)) : ('Option ' + (oi + 1))} onChange={function (e) { setOption(gi, oi, { label: e.target.value }); }} />
                    <div style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>
                      <span style={{ fontSize: 12, color: 'var(--fg-muted)' }}>+AED</span>
                      <input type="number" style={Object.assign({}, inp, { width: 74 })} value={o.price_adjustment ? o.price_adjustment : 0} onChange={function (e) { setOption(gi, oi, { price_adjustment: e.target.value === '' ? 0 : Number(e.target.value) }); }} />
                    </div>
                    <label style={{ display: 'inline-flex', alignItems: 'center', gap: 5, fontSize: 12.5, whiteSpace: 'nowrap', color: 'var(--fg-secondary)' }}>
                      <input type="checkbox" checked={o.is_available !== false} onChange={function (e) { setOption(gi, oi, { is_available: e.target.checked }); }} />{ar ? 'متوفر' : 'Available'}
                    </label>
                    <label style={{ display: 'inline-flex', alignItems: 'center', gap: 5, fontSize: 12, cursor: 'pointer', color: 'var(--espresso)', border: '1px dashed var(--line-strong)', borderRadius: 8, padding: '4px 8px', whiteSpace: 'nowrap' }} title={ar ? 'صورة الخيار' : 'Option image'}>
                      {o.image_url ? <img src={o.image_url} alt="" style={{ width: 24, height: 24, borderRadius: 5, objectFit: 'cover', display: 'block' }} /> : <Icon name="image" size={14} />}
                      {uploading[gi + '-' + oi] ? '…' : (o.image_url ? (ar ? 'تغيير' : 'Change') : (ar ? 'صورة' : 'Image'))}
                      <input type="file" accept="image/*" style={{ display: 'none' }} onChange={handleUpload(gi, oi)} />
                    </label>
                    {o.image_url ? <button type="button" onClick={function () { setOption(gi, oi, { image_url: '' }); }} title={ar ? 'إزالة الصورة' : 'Remove image'} style={{ border: 'none', background: 'transparent', color: 'var(--fg-muted)', cursor: 'pointer', fontSize: 12 }}>{ar ? 'إزالة' : 'clear'}</button> : null}
                    <button type="button" onClick={function () { removeOption(gi, oi); }} title={ar ? 'حذف' : 'Remove'} style={{ border: 'none', background: 'transparent', color: 'var(--error)', cursor: 'pointer', fontSize: 17, lineHeight: 1, padding: '0 4px' }}>×</button>
                  </div>
                );
              })}
              <button type="button" onClick={function () { addOption(gi); }} style={{ marginTop: 2, border: '1px dashed var(--line-strong)', background: 'var(--white)', borderRadius: 8, padding: '6px 12px', cursor: 'pointer', fontSize: 12.5, fontWeight: 600, color: 'var(--espresso)' }}>{ar ? '+ إضافة خيار' : '+ Add option'}</button>
            </div>
          );
        })}

        <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', alignItems: 'center' }}>
          <button type="button" onClick={function () { addGroup(''); }} style={{ border: '1px solid var(--espresso)', background: 'var(--espresso)', color: 'var(--gold-light)', borderRadius: 10, padding: '9px 16px', cursor: 'pointer', fontSize: 13, fontWeight: 600 }}>{ar ? '+ إضافة خيار' : '+ Add option group'}</button>
          {QUICK.map(function (q, i) {
            return <button key={i} type="button" onClick={function () { addGroup(q[0]); }} style={{ border: '1px dashed var(--line-strong)', background: 'var(--white)', color: 'var(--fg-secondary)', borderRadius: 999, padding: '6px 12px', cursor: 'pointer', fontSize: 12.5, fontWeight: 600 }}>+ {q[0]}</button>;
          })}
        </div>
      </div>
    );
  }

  /* ---------- Customer selector (pills) ---------- */
  function VariationSelector(props) {
    var ar = props.ar;
    var groups = Array.isArray(props.variations) ? props.variations.filter(function (g) { return g && (g.options || []).length; }) : [];
    var st = useState({});
    var sel = st[0];
    var setSel = st[1];
    if (!groups.length) return null;

    var pick = function (gi, oi) {
      var opt = (groups[gi].options || [])[oi];
      if (opt && opt.is_available === false) return;
      var next = Object.assign({}, sel);
      if (next[gi] === oi) { delete next[gi]; } else { next[gi] = oi; }
      setSel(next);
      props.onChange && props.onChange(next, priceDelta(groups, next), selectionSummary(groups, next, ar), selectedImage(groups, next));
    };
    var gname = function (g) { return (ar && g.name_ar) ? g.name_ar : (g.name || g.type || ''); };
    var oname = function (o) { return (ar && o.label_ar) ? o.label_ar : (o.label || o.value || ''); };

    return (
      <div style={{ marginTop: 4, marginBottom: 4 }}>
        {groups.map(function (g, gi) {
          return (
            <div key={gi} style={{ marginBottom: 14 }}>
              <div style={{ fontSize: 12.5, fontWeight: 700, color: 'var(--fg-primary)', marginBottom: 7 }}>
                {(ar ? 'اختر ' : 'Choose ') + gname(g)}
              </div>
              <div style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }}>
                {(g.options || []).map(function (o, oi) {
                  var chosen = sel[gi] === oi;
                  var off = o.is_available === false;
                  var pa = Number(o.price_adjustment) || 0;
                  return (
                    <button key={oi} type="button" disabled={off} onClick={function () { pick(gi, oi); }}
                      style={{ display: 'inline-flex', alignItems: 'center', gap: 7, padding: o.image_url ? '5px 14px 5px 5px' : '8px 14px', borderRadius: 999, cursor: off ? 'not-allowed' : 'pointer', fontFamily: 'var(--font-body)', fontSize: 13, fontWeight: 600,
                        background: chosen ? 'var(--espresso)' : 'var(--white)', color: off ? 'var(--fg-muted)' : (chosen ? 'var(--ivory)' : 'var(--fg-primary)'),
                        border: '1px solid ' + (chosen ? 'var(--espresso)' : 'var(--line-strong)'), opacity: off ? 0.5 : 1, textDecoration: off ? 'line-through' : 'none' }}>
                      {o.image_url ? <img src={o.image_url} alt="" style={{ width: 24, height: 24, borderRadius: 999, objectFit: 'cover', display: 'block' }} /> : null}{oname(o)}{pa ? <span style={{ fontWeight: 400, opacity: 0.8 }}>{' +AED ' + pa}</span> : null}
                    </button>
                  );
                })}
              </div>
            </div>
          );
        })}
      </div>
    );
  }

  /* ---------- Staff summary ---------- */
  function VariationSummary(props) {
    var ar = props.ar;
    var groups = readVariations(props.item || { variations: props.variations });
    if (!groups.length) return <span style={{ fontSize: 12, color: 'var(--fg-muted)' }}>{ar ? 'لا توجد تنويعات' : 'No variations'}</span>;
    var issues = [];
    groups.forEach(function (g) {
      if (!g.name && !g.type) issues.push(ar ? 'مجموعة بدون اسم' : 'group missing name');
      (g.options || []).forEach(function (o) { if (!o.label && !o.value) issues.push(ar ? 'خيار بدون اسم' : 'option missing label'); });
      if ((g.options || []).length && (g.options || []).every(function (o) { return o.is_available === false; })) issues.push((g.name || g.type) + (ar ? ': كل الخيارات غير متوفرة' : ': all options unavailable'));
    });
    return (
      <div style={{ fontSize: 12.5, color: 'var(--fg-secondary)' }}>
        <div style={{ fontWeight: 700, color: 'var(--espresso)' }}>{(ar ? 'التنويعات: ' : 'Variations: ') + groups.length + (ar ? ' مجموعة' : (groups.length === 1 ? ' group' : ' groups'))}</div>
        {groups.map(function (g, gi) {
          return <div key={gi} style={{ marginTop: 3 }}>• <b>{g.name || g.type}</b> — {(g.options || []).map(function (o) { return (o.label || o.value || '?') + (Number(o.price_adjustment) ? ' (+' + o.price_adjustment + ')' : '') + (o.is_available === false ? ' ✕' : ''); }).join(', ')}</div>;
        })}
        {issues.length ? <div style={{ marginTop: 5, color: 'var(--error)', fontWeight: 600 }}>{(ar ? 'تنبيهات: ' : 'Warnings: ') + issues.join('; ')}</div> : null}
      </div>
    );
  }

  window.SarayaVariations = { read: readVariations, priceDelta: priceDelta, summary: selectionSummary, image: selectedImage };
  window.VariationEditor = VariationEditor;
  window.VariationSelector = VariationSelector;
  window.VariationSummary = VariationSummary;
})();
