import { asc, eq } from "drizzle-orm";
import { db } from "@/db";
import { menuCategories, menuItems, menuItemVariants } from "@/db/schema";

const escapeXml = (value: unknown) => String(value ?? "").replace(/[<>&'\"]/g, (char) => ({ "<": "&lt;", ">": "&gt;", "&": "&amp;", "'": "&apos;", '"': "&quot;" }[char] || char));
const publicImageUrl = (value: string | null) => { if (!value || /yandex\.ru|yastatic\.net|avatars\.mds\.yandex\.net/i.test(value)) return null; const base = process.env.NEXT_PUBLIC_SITE_URL || "https://kiln.spb.ru"; return value.startsWith("/") ? `${base}${value}` : /^https:\/\//.test(value) ? value : null; };
export async function buildYandexFeed() {
  if (!db) throw new Error("Menu database is not configured");
  const [categories, items, variants] = await Promise.all([db.select().from(menuCategories).where(eq(menuCategories.isActive, true)).orderBy(asc(menuCategories.sortOrder)), db.select().from(menuItems).where(eq(menuItems.showOnWebsite, true)).orderBy(asc(menuItems.sortOrder)), db.select().from(menuItemVariants).orderBy(asc(menuItemVariants.sortOrder))]);
  const categoryById = new Map(categories.map((category) => [category.id, category]));
  const offers = items.flatMap((item) => variants.filter((variant) => variant.itemId === item.id && variant.priceKopecks > 0 && item.publishToYandex).map((variant) => { const picture = publicImageUrl(item.imageUrl); return `<offer id="${escapeXml(variant.yandexOfferId)}" available="${variant.isAvailable && item.isAvailable ? "true" : "unknown"}"><name>${escapeXml(`${item.name}${variant.label ? `, ${variant.label}` : ""}`)}</name>${item.producer ? `<vendor>${escapeXml(item.producer)}</vendor>` : ""}<price>${variant.priceKopecks / 100}</price><currencyId>RUB</currencyId><categoryId>${categoryById.get(item.categoryId)?.yandexCategoryId || item.categoryId}</categoryId><description>${escapeXml(item.description)}</description>${item.shortDescription ? `<shortDescription>${escapeXml(item.shortDescription)}</shortDescription>` : ""}${picture ? `<picture>${escapeXml(picture)}</picture>` : ""}</offer>`; }));
  const xml = `<?xml version="1.0" encoding="UTF-8"?><yml_catalog date="${new Date().toISOString()}"><shop><name>KILN</name><company>KILN</company><url>https://kiln.spb.ru</url><currencies><currency id="RUB" rate="1"/></currencies><categories>${categories.map((c) => `<category id="${c.yandexCategoryId}">${escapeXml(c.name)}</category>`).join("")}</categories><offers>${offers.join("")}</offers></shop></yml_catalog>`;
  return { xml, count: offers.length };
}
