import { CatalogProductRecord } from '@/types';
import { cleanHtmlDescription, normalizeImageUrl } from './item-mapper';

function escapeXml(unsafe: string): string {
  return unsafe.replace(/[<>&'"]/g, (c) => {
    switch (c) {
      case '<': return '&lt;';
      case '>': return '&gt;';
      case '&': return '&amp;';
      case '\'': return '&apos;';
      case '"': return '&quot;';
      default: return c;
    }
  });
}

function formatCdata(text: string): string {
  return `<![CDATA[${text}]]>`;
}

/**
 * Generates an RSS 2.0 XML product feed formatted specifically for Meta (Facebook & Instagram) Catalog Commerce.
 * Adheres to Facebook / Google Merchant Center standard product specification.
 */
export function generateMetaXmlFeed(products: CatalogProductRecord[], shopDomain: string): string {
  const itemsXml = products.map((p) => {
    const variantId = p.shopify_variant_id.replace(/^.*\//, '');
    const productId = p.shopify_product_id.replace(/^.*\//, '');
    const itemId = `shopify_US_${productId}_${variantId}`;
    const cleanDesc = cleanHtmlDescription(p.description || p.title) || p.title;
    const currency = (p.currency || 'USD').toUpperCase();
    const mainImg = normalizeImageUrl(p.image_url) || 'https://via.placeholder.com/600x600?text=No+Image';

    const isOnSale = Boolean(p.compare_at_price && p.compare_at_price > p.price && p.price > 0);
    const regularPriceStr = isOnSale
      ? `${p.compare_at_price!.toFixed(2)} ${escapeXml(currency)}`
      : `${p.price.toFixed(2)} ${escapeXml(currency)}`;
    const salePriceTag = isOnSale
      ? `\n      <g:sale_price>${p.price.toFixed(2)} ${escapeXml(currency)}</g:sale_price>`
      : '';

    const additionalImagesTags = (p.additional_images || [])
      .map(img => normalizeImageUrl(img))
      .filter(img => img && img !== mainImg)
      .slice(0, 19)
      .map(img => `\n      <g:additional_image_link>${escapeXml(img)}</g:additional_image_link>`)
      .join('');

    return `    <item>
      <g:id>${escapeXml(itemId)}</g:id>
      <g:item_group_id>${escapeXml(`shopify_US_${productId}`)}</g:item_group_id>
      <g:title>${formatCdata(p.variant_title ? `${p.title} - ${p.variant_title}` : p.title)}</g:title>
      <g:description>${formatCdata(cleanDesc)}</g:description>
      <g:link>${escapeXml(p.product_url)}</g:link>
      <g:image_link>${escapeXml(mainImg)}</g:image_link>${additionalImagesTags}
      <g:brand>${formatCdata(p.brand || 'Store')}</g:brand>
      <g:condition>${escapeXml(p.condition || 'new')}</g:condition>
      <g:availability>${escapeXml((p.availability || 'in stock').toLowerCase())}</g:availability>
      <g:price>${regularPriceStr}</g:price>${salePriceTag}
      ${p.sku ? `<g:mpn>${escapeXml(p.sku)}</g:mpn>` : ''}
      ${p.barcode ? `<g:gtin>${escapeXml(p.barcode)}</g:gtin>` : ''}
      ${p.google_product_category ? `<g:google_product_category>${formatCdata(p.google_product_category)}</g:google_product_category>` : ''}
      ${p.fb_product_category ? `<g:fb_product_category>${formatCdata(p.fb_product_category)}</g:fb_product_category>` : ''}
      ${p.video_url ? `<g:video>${escapeXml(p.video_url)}</g:video>` : ''}
      ${p.custom_label_0 ? `<g:custom_label_0>${formatCdata(p.custom_label_0)}</g:custom_label_0>` : ''}
      ${p.custom_label_1 ? `<g:custom_label_1>${formatCdata(p.custom_label_1)}</g:custom_label_1>` : ''}
      ${p.custom_label_2 ? `<g:custom_label_2>${formatCdata(p.custom_label_2)}</g:custom_label_2>` : ''}
    </item>`;
  }).join('\n');

  return `<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
  <channel>
    <title>${escapeXml(shopDomain)} Meta Product Feed</title>
    <link>https://${escapeXml(shopDomain)}</link>
    <description>Facebook and Instagram Commerce Product Feed generated by Meta Connector App</description>
${itemsXml}
  </channel>
</rss>`;
}

/**
 * Generates CSV feed formatted for Meta Catalog.
 */
export function generateMetaCsvFeed(products: CatalogProductRecord[]): string {
  const headers = [
    'id',
    'item_group_id',
    'title',
    'description',
    'availability',
    'condition',
    'price',
    'sale_price',
    'link',
    'image_link',
    'additional_image_link',
    'brand',
    'google_product_category',
    'fb_product_category',
    'video',
    'custom_label_0',
    'custom_label_1',
    'custom_label_2',
  ];

  const escapeCsv = (val: string | number | undefined | null) => {
    if (val === undefined || val === null) return '""';
    const str = String(val).replace(/"/g, '""');
    return `"${str}"`;
  };

  const rows = products.map((p) => {
    const variantId = p.shopify_variant_id.replace(/^.*\//, '');
    const productId = p.shopify_product_id.replace(/^.*\//, '');
    const itemId = `shopify_US_${productId}_${variantId}`;
    const cleanDesc = cleanHtmlDescription(p.description || p.title) || p.title;
    const currency = (p.currency || 'USD').toUpperCase();
    const mainImg = normalizeImageUrl(p.image_url) || 'https://via.placeholder.com/600x600?text=No+Image';

    const isOnSale = Boolean(p.compare_at_price && p.compare_at_price > p.price && p.price > 0);
    const priceField = isOnSale
      ? `${p.compare_at_price!.toFixed(2)} ${currency}`
      : `${p.price.toFixed(2)} ${currency}`;
    const salePriceField = isOnSale ? `${p.price.toFixed(2)} ${currency}` : '';

    const additionalImgsStr = (p.additional_images || [])
      .map(img => normalizeImageUrl(img))
      .filter(img => img && img !== mainImg)
      .slice(0, 19)
      .join(',');

    return [
      escapeCsv(itemId),
      escapeCsv(`shopify_US_${productId}`),
      escapeCsv(p.variant_title ? `${p.title} - ${p.variant_title}` : p.title),
      escapeCsv(cleanDesc),
      escapeCsv((p.availability || 'in stock').toLowerCase()),
      escapeCsv(p.condition || 'new'),
      escapeCsv(priceField),
      escapeCsv(salePriceField),
      escapeCsv(p.product_url),
      escapeCsv(mainImg),
      escapeCsv(additionalImgsStr),
      escapeCsv(p.brand || 'Store'),
      escapeCsv(p.google_product_category || ''),
      escapeCsv(p.fb_product_category || ''),
      escapeCsv(p.video_url || ''),
      escapeCsv(p.custom_label_0 || ''),
      escapeCsv(p.custom_label_1 || ''),
      escapeCsv(p.custom_label_2 || ''),
    ].join(',');
  });

  return [headers.join(','), ...rows].join('\n');
}
