import type { FeedMarker } from '@/server/db/queries/feed.js';

export type MapPopupLocale = 'he' | 'en';

export type VendorPin = {
  vendorId: string;
  vendorName: string;
  lat: number;
  lng: number;
  address: string | null;
  deals: FeedMarker[];
};

export function groupMarkersByVendor(markers: FeedMarker[]): VendorPin[] {
  const map = new Map<string, VendorPin>();
  for (const marker of markers) {
    const key = `${marker.vendorId}|${marker.lat}|${marker.lng}`;
    if (!map.has(key)) {
      map.set(key, {
        vendorId: marker.vendorId,
        vendorName: marker.vendorName,
        lat: marker.lat,
        lng: marker.lng,
        address: marker.address,
        deals: [],
      });
    }
    map.get(key)?.deals.push(marker);
  }
  return [...map.values()];
}

export function escapePopupHtml(value: string): string {
  return value
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;');
}

function popupDirection(locale: MapPopupLocale): 'rtl' | 'ltr' {
  return locale === 'he' ? 'rtl' : 'ltr';
}

function dealHref(locale: MapPopupLocale, slug?: string, heSlug?: string): string {
  if (locale === 'en') {
    if (slug) return `/en/deals/${encodeURIComponent(slug)}`;
    return heSlug ? `/deals/${encodeURIComponent(heSlug)}` : '/deals';
  }
  return slug ? `/deals/${encodeURIComponent(slug)}` : '/deals';
}

export function buildVendorPopup(
  pin: VendorPin,
  locale: MapPopupLocale,
  fmtPrice: (shekels: number) => string,
): string {
  const dealsHtml = pin.deals
    .map((deal) => {
      return `<div style="margin-block-end:var(--map-popup-deal-gap)">
        <span style="font-size:var(--font-size-sm);font-weight:var(--font-weight-bold)">${fmtPrice(deal.discountedPrice)}</span>
        <span style="font-size:var(--font-size-2xs);text-decoration:line-through;opacity:0.5;margin-inline-start:var(--spacing-1)">${fmtPrice(deal.originalPrice)}</span>
        <a href="${dealHref(locale, deal.slug, deal.heSlug)}" style="display:block;font-size:var(--font-size-xs);color:var(--color-brand-primary-600);margin-block-start:var(--spacing-0_5)">${escapePopupHtml(deal.title)}</a>
      </div>`;
    })
    .join('');
  const addressHtml = pin.address
    ? `<small style="opacity:0.6;display:block;margin-block-end:var(--spacing-2)">${escapePopupHtml(pin.address)}</small>`
    : '';

  return `<div style="min-width:var(--map-popup-min-width);max-width:var(--map-popup-max-width);font-family:var(--font-sans);direction:${popupDirection(locale)};text-align:start">
    <strong style="display:block;font-size:var(--font-size-md);margin-block-end:var(--spacing-0_5)">${escapePopupHtml(pin.vendorName)}</strong>
    ${addressHtml}
    <div style="border-block-start:var(--spacing-px) solid var(--color-border-default);padding-block-start:var(--spacing-1_5)">${dealsHtml}</div>
  </div>`;
}

export function buildClusterPopup(
  pins: VendorPin[],
  dealsCountLabel: string,
  locale: MapPopupLocale,
  fmtPrice: (shekels: number) => string,
): string {
  const totalDeals = pins.reduce((sum, pin) => sum + pin.deals.length, 0);
  const vendorsHtml = pins
    .map((pin) => {
      const addressHtml = pin.address
        ? `<small style="opacity:0.6;margin-inline-start:var(--spacing-1_5)">${escapePopupHtml(pin.address)}</small>`
        : '';
      const dealsHtml = pin.deals
        .map(
          (deal) =>
            `<div style="margin-block-start:var(--spacing-1)">
              <a href="${dealHref(locale, deal.slug, deal.heSlug)}" style="font-size:var(--font-size-xs);color:var(--color-brand-primary-600)">${escapePopupHtml(deal.title)}</a>
              <span style="font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);margin-inline-start:var(--spacing-1_5)">${fmtPrice(deal.discountedPrice)}</span>
            </div>`,
        )
        .join('');
      return `<div style="margin-block-end:var(--spacing-2_5);border-block-end:var(--spacing-px) solid var(--color-border-default);padding-block-end:var(--spacing-2)">
        <strong style="font-size:var(--font-size-md)">${escapePopupHtml(pin.vendorName)}</strong>${addressHtml}
        ${dealsHtml}
      </div>`;
    })
    .join('');
  const headerLabel = dealsCountLabel
    .replace('{deals}', String(totalDeals))
    .replace('{businesses}', String(pins.length));

  return `<div style="min-width:var(--map-popup-cluster-min-width);max-width:var(--map-popup-cluster-max-width);font-family:var(--font-sans);direction:${popupDirection(locale)};text-align:start;overflow-y:auto;max-block-size:var(--map-popup-cluster-max-height)">
    <strong style="display:block;font-size:var(--font-size-xs);opacity:0.55;margin-block-end:var(--spacing-2)">${escapePopupHtml(headerLabel)}</strong>
    ${vendorsHtml}
  </div>`;
}
