/* YeYe Portal v20 — persistent cart + drawer */
(function () {
  const STORAGE_KEY = 'yeye-cart-v1';
  const CURRENCY_RATES = { EUR: 1, USD: 1.2, CZK: 24.24, TRY: 53.72 };
  const DIY_PRECHECK_DISMISS_KEY = 'yeye-diy-precheck-dismissed';
  const DIY_PRECHECK_SESSION_KEY = 'yeye-diy-precheck-dismissed-session';
  const DIY_PRECHECK_PRODUCT_IDS = { en: '6a7282eab3d45741a32cc976', tr: '6a7282ed451ecc71bf10425a' };
  const DIY_PRECHECK_PRICES = { EUR: 10, USD: 12, CZK: 250, TRY: 550 };
  const listeners = new Set();

  try {
    if (!sessionStorage.getItem(DIY_PRECHECK_SESSION_KEY)) {
      localStorage.removeItem(DIY_PRECHECK_DISMISS_KEY);
      sessionStorage.setItem(DIY_PRECHECK_SESSION_KEY, '1');
    }
  } catch (_) {}

  function safeState(value) {
    const items = value && Array.isArray(value.items)
      ? value.items.filter((item) => item && item.id && (item.priceId || item.name))
      : [];
    return { items };
  }
  function load() {
    try { return safeState(JSON.parse(localStorage.getItem(STORAGE_KEY) || '{"items":[]}')); }
    catch (_) { return { items: [] }; }
  }
  let state = load();
  function publish(nextState) {
    state = safeState(nextState);
    try { localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); } catch (_) {}
    listeners.forEach((fn) => { try { fn(state); } catch (_) {} });
  }

  window.YEYE_CART = {
    getState() { return state; },
    subscribe(fn) { listeners.add(fn); return () => listeners.delete(fn); },
    addItem(item) {
      const next = Object.assign({}, item || {}, {
        id: (item && item.id) || ('cart-' + Date.now().toString(36) + '-' + Math.random().toString(36).slice(2, 8)),
        qty: Math.max(1, Math.floor(Number(item && item.qty) || 1)),
        addedAt: (item && item.addedAt) || new Date().toISOString(),
      });
      publish({ items: state.items.concat(next) });
      return next;
    },
    removeItem(id) { publish({ items: state.items.filter((item) => item.id !== id) }); },
    setQty(id, qty) {
      const nextQty = Math.max(1, Math.floor(Number(qty) || 1));
      publish({ items: state.items.map((item) => item.id === id ? Object.assign({}, item, { qty: nextQty }) : item) });
    },
    clear() { publish({ items: [] }); },
  };

  function useCartState() {
    const [cart, setCart] = useState(() => window.YEYE_CART.getState());
    useEffect(() => window.YEYE_CART.subscribe((next) => setCart(Object.assign({}, next))), []);
    return cart;
  }
  function normalizeCurrency(currency) {
    const code = String(currency || 'EUR').toUpperCase();
    return CURRENCY_RATES[code] ? code : 'EUR';
  }
  function convertCartAmount(amount, fromCurrency, toCurrency) {
    const from = normalizeCurrency(fromCurrency);
    const to = normalizeCurrency(toCurrency);
    const sourceRate = CURRENCY_RATES[from] || 1;
    const targetRate = CURRENCY_RATES[to] || 1;
    return (Number(amount) || 0) / sourceRate * targetRate;
  }
  function groupedTotals(items, targetCurrency) {
    const target = targetCurrency ? normalizeCurrency(targetCurrency) : '';
    return (items || []).reduce((totals, item) => {
      const currency = target || normalizeCurrency(item.uiCurrency);
      const unit = target
        ? convertCartAmount(item.uiPrice, item.uiCurrency, target)
        : (Number(item.uiPrice) || 0);
      totals[currency] = (totals[currency] || 0) + unit * (Number(item.qty) || 1);
      return totals;
    }, {});
  }
  function cartMoney(amount, currency) {
    try { return new Intl.NumberFormat(undefined, { style: 'currency', currency: currency || 'EUR', maximumFractionDigits: 2 }).format(amount || 0); }
    catch (_) { return String(amount || 0) + ' ' + (currency || 'EUR'); }
  }
  function cartItemKey(item) {
    return String((item && (item.serviceKey || item.productKey || item.variantKey)) || '').toLowerCase();
  }
  function isDiyCartItem(item) {
    return String((item && item.tier) || '') === 'DIY-Docs'
      || /_diy$/.test(cartItemKey(item))
      || /\s—\sDIY$/i.test(String((item && item.name) || ''));
  }
  function isDiyPrecheckCartItem(item) {
    const key = cartItemKey(item);
    const productId = String((item && item.productId) || '');
    return key === 'diy_document_precheck'
      || Object.values(DIY_PRECHECK_PRODUCT_IDS).includes(productId);
  }
  function precheckPrice(currency) {
    const code = String(currency || 'EUR').toUpperCase();
    return Object.prototype.hasOwnProperty.call(DIY_PRECHECK_PRICES, code)
      ? { amount: DIY_PRECHECK_PRICES[code], currency: code }
      : { amount: DIY_PRECHECK_PRICES.EUR, currency: 'EUR' };
  }
  function precheckCartItem(lang, currency, t) {
    const locale = lang === 'tr' ? 'tr' : 'en';
    const price = precheckPrice(currency);
    return {
      productKey: 'diy_document_precheck',
      productId: DIY_PRECHECK_PRODUCT_IDS[locale],
      serviceKey: 'diy_document_precheck',
      name: t('diy.precheck.title'),
      variantKey: 'one_time',
      uiPrice: price.amount,
      uiCurrency: price.currency,
      qty: 1,
    };
  }
  function DiyPrecheckNudge({ cartItems, hasDiyPurchase = false, requireDiyInCart = false }) {
    const { t, lang, currency } = useT();
    const items = cartItems || [];
    const [dismissed, setDismissed] = useState(() => {
      try { return localStorage.getItem(DIY_PRECHECK_DISMISS_KEY) === '1'; } catch (_) { return false; }
    });
    const cartSignature = items.map((item) => [item.id, item.qty, cartItemKey(item)].join(':')).join('|');
    const previousCartSignature = useRef(cartSignature);
    useEffect(() => {
      const syncDismissal = () => {
        try { setDismissed(localStorage.getItem(DIY_PRECHECK_DISMISS_KEY) === '1'); }
        catch (_) { setDismissed(false); }
      };
      window.addEventListener('yeye:diy-precheck-dismissed', syncDismissal);
      return () => window.removeEventListener('yeye:diy-precheck-dismissed', syncDismissal);
    }, []);
    useEffect(() => {
      if (previousCartSignature.current === cartSignature) return;
      previousCartSignature.current = cartSignature;
      try { localStorage.removeItem(DIY_PRECHECK_DISMISS_KEY); } catch (_) {}
      setDismissed(false);
      window.dispatchEvent(new Event('yeye:diy-precheck-dismissed'));
    }, [cartSignature]);
    const hasDiyInCart = items.some(isDiyCartItem);
    const alreadyInCart = items.some(isDiyPrecheckCartItem);
    if (dismissed || alreadyInCart || (requireDiyInCart ? !hasDiyInCart : !hasDiyPurchase)) return null;
    const item = precheckCartItem(lang, currency, t);
    const priceLabel = cartMoney(item.uiPrice, item.uiCurrency);
    const dismiss = () => {
      try { localStorage.setItem(DIY_PRECHECK_DISMISS_KEY, '1'); } catch (_) {}
      setDismissed(true);
      window.dispatchEvent(new Event('yeye:diy-precheck-dismissed'));
    };
    const add = () => {
      window.YEYE_CART.addItem(item);
      if (window.YEYE_TOAST) window.YEYE_TOAST(t('cart.added'));
    };
    return (
      <div style={{ border: '1px solid var(--line-2)', borderLeft: '4px solid var(--brand-500)', borderRadius: 'var(--r-md)', background: 'var(--brand-50)', padding: '13px 14px', display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap', marginTop: requireDiyInCart ? 16 : 0 }}>
        <div style={{ width: 34, height: 34, borderRadius: 9, background: '#fff', color: 'var(--brand-700)', display: 'flex', alignItems: 'center', justifyContent: 'center', flex: '0 0 auto' }}><Icon name="shield-check" size={18} /></div>
        <div style={{ flex: '1 1 230px', minWidth: 0 }}>
          <div className="strong" style={{ color: 'var(--ink-900)', fontSize: 13.5 }}>{t('diy.precheck.title')}</div>
          <div className="muted" style={{ fontSize: 12.5, marginTop: 3 }}>{t('diy.precheck.body')}</div>
        </div>
        <div className="flex ac gap-8 wrap">
          <Btn variant="primary" size="sm" icon="shopping-cart" onClick={add}>{t('diy.precheck.cta')} ({priceLabel})</Btn>
          <button type="button" onClick={dismiss} aria-label={t('diy.precheck.dismiss')} style={{ border: 'none', background: 'transparent', color: 'var(--ink-500)', fontSize: 12, cursor: 'pointer', padding: '7px 4px' }}>{t('diy.precheck.dismiss')}</button>
        </div>
      </div>
    );
  }
  function CartIcon({ count, onClick }) {
    const { t } = useT();
    return (
      <button type="button" className="icon-btn cart-icon-btn" onClick={onClick} aria-label={t('cart.title')}>
        <Icon name="shopping-cart" size={19} />
        {count > 0 && <span className="cart-count">{count > 99 ? '99+' : count}</span>}
      </button>
    );
  }
  function pickDefaultVariant(product) {
    if (!product || !Array.isArray(product.variants) || !product.variants.length) return null;
    return product.variants.find((v) => v.key === 'professional') || product.variants.find((v) => v.key === 'standard') || product.variants[0];
  }
  function localizedText(value, lang) {
    if (!value || typeof value !== 'object') return value;
    return value[lang] || value.en || value.tr || value.cs || '';
  }
  function serviceLabelFor(productKey, lang) {
    const services = (window.YEYE && window.YEYE.services) || [];
    const match = services.find((s) => s.k === productKey || s.k === productKey + '_family');
    return (match && localizedText(match.name, lang)) || productKey;
  }
  function recommendationsFromCart(cartItems) {
    const catalog = (window.YEYE && window.YEYE.marketplaceProducts) || [];
    const recMap = (window.YEYE && window.YEYE.marketplaceRecommendations) || {};
    const inCartKeys = new Set((cartItems || []).map((i) => i.productKey));
    const suggested = new Set();
    (cartItems || []).forEach((item) => {
      (recMap[item.productKey] || []).forEach((k) => { if (!inCartKeys.has(k)) suggested.add(k); });
    });
    return Array.from(suggested)
      .map((key) => catalog.find((p) => p.key === key))
      .filter((p) => p && !p.comingSoon)
      .slice(0, 4);
  }
  function CartRecommendations({ cartItems, onAdd }) {
    const { t, lang, currency } = useT();
    const recs = recommendationsFromCart(cartItems);
    if (!recs.length) return null;
    return (
      <div className="cart-recs">
        <div className="eyebrow">{t('cart.recommendedTitle')}</div>
        <div className="cart-recs-grid">
          {recs.map((product) => {
            const variant = pickDefaultVariant(product);
            if (!variant) return null;
            const label = serviceLabelFor(product.key, lang);
            return (
              <div className="cart-rec-card" key={product.key}>
                <div className="cart-rec-body">
                  <div className="strong">{label}</div>
                  <div className="muted">{cartMoney(convertCartAmount(variant.uiPrice, variant.uiCurrency, currency), currency)}</div>
                </div>
                <button type="button" className="cart-rec-add" onClick={() => onAdd(product, variant, label)} aria-label={t('cart.addToCart')}>
                  <Icon name="plus" size={15} />
                </button>
              </div>
            );
          })}
        </div>
      </div>
    );
  }
  function CartDrawer({ open, onClose, onCheckout, onContinueShopping }) {
    const { t, currency } = useT();
    const cart = useCartState();
    useEffect(() => {
      if (!open) return undefined;
      const onKeyDown = (event) => { if (event.key === 'Escape') onClose(); };
      window.addEventListener('keydown', onKeyDown);
      return () => window.removeEventListener('keydown', onKeyDown);
    }, [open, onClose]);
    if (!open) return null;
    const totals = groupedTotals(cart.items, currency);
    const continueShopping = () => {
      onClose();
      if (onContinueShopping) onContinueShopping();
      else if (window.YEYE_GO) window.YEYE_GO('services');
    };
    return (
      <>
        <div className="cart-scrim" onClick={onClose} />
        <aside className="cart-drawer" role="dialog" aria-modal="true" aria-label={t('cart.title')}>
          <div className="cart-drawer-head">
            <div className="flex ac gap-10"><Icon name="shopping-cart" size={19} /><div className="h3">{t('cart.title')}</div></div>
            <IconBtn name="x" onClick={onClose} />
          </div>
          <div className="cart-drawer-body">
            {cart.items.length === 0 ? (
              <div className="cart-empty">
                <div className="cart-empty-icon"><Icon name="shopping-bag" size={26} /></div>
                <div className="h3">{t('cart.empty')}</div>
                <Btn variant="primary" icon="grid-2x2" onClick={continueShopping}>{t('cart.exploreServices')}</Btn>
              </div>
            ) : (
              <div className="cart-items">
                {cart.items.map((item) => (
                  <div className="cart-row" key={item.id}>
                    <div className="cart-row-main">
                      <div className="strong">{item.name}</div>
                      <div className="muted">{item.variantLabel}</div>
                      <div className="strong tnum">{cartMoney(convertCartAmount(item.uiPrice, item.uiCurrency, currency), currency)}</div>
                    </div>
                    <div className="cart-row-actions">
                      <div className="qty-stepper">
                        <button type="button" onClick={() => window.YEYE_CART.setQty(item.id, item.qty - 1)} disabled={item.qty <= 1}>−</button>
                        <span>{item.qty}</span>
                        <button type="button" onClick={() => window.YEYE_CART.setQty(item.id, item.qty + 1)}>+</button>
                      </div>
                      <button type="button" className="cart-remove" onClick={() => window.YEYE_CART.removeItem(item.id)} aria-label={t('cart.remove')}><Icon name="x" size={16} /></button>
                    </div>
                  </div>
                ))}
              </div>
            )}
            {cart.items.length > 0 && (
              <>
                <DiyPrecheckNudge cartItems={cart.items} requireDiyInCart />
                <CartRecommendations
                  cartItems={cart.items}
                  onAdd={(product, variant, label) => {
	                  window.YEYE_CART.addItem({
	                    productKey: product.key,
	                    priceId: variant.priceId || product.priceId || null,
	                    productId: variant.productId || product.productId || null,
	                    serviceKey: variant.serviceKey || product.key,
	                    name: label,
                    variantKey: variant.key,
                    variantLabel: t(variant.labelTk) || variant.key,
                    uiPrice: variant.uiPrice,
                    uiCurrency: variant.uiCurrency,
                    qty: 1,
                  });
                  }}
                />
              </>
            )}
            <div className="cart-test-warning"><Icon name="triangle-alert" size={16} /><span>{t('cart.testAmountWarning')}</span></div>
          </div>
          {cart.items.length > 0 && (
            <div className="cart-drawer-foot">
              <div className="cart-totals">
                <div className="eyebrow">{t('cart.subtotal')}</div>
                {Object.keys(totals).map((code) => <div className="cart-total-line" key={code}><span>{code}</span><strong>{cartMoney(totals[code], code)}</strong></div>)}
              </div>
              <div className="cart-footer-actions">
                <Btn variant="ghost" onClick={continueShopping}>{t('cart.continueShopping')}</Btn>
                <Btn variant="primary" iconR="arrow-right" onClick={onCheckout}>{t('cart.checkout')}</Btn>
              </div>
            </div>
          )}
        </aside>
      </>
    );
  }
  Object.assign(window, {
    CartIcon,
    CartDrawer,
    useCartState,
    YEYE_CART_TOTALS: groupedTotals,
    YEYE_CART_MONEY: cartMoney,
    YEYE_CART_CONVERT: convertCartAmount,
    YEYE_CART_CURRENCY: normalizeCurrency,
    DiyPrecheckNudge,
  });
})();
