import { asc, eq, isNull } from "drizzle-orm";
import { db } from "@/db";
import { menuCategories, menuItems, menuItemSbisLinks, menuItemVariants, sbisCatalogItems } from "@/db/schema";
import { syncSbisCatalog } from "@/lib/sbis-catalog-sync";
import type { Dish, MenuCategory } from "@/lib/types";

const featuredHitSlugs = new Set([
  "big-meat-set", "brisket-potato", "ribs", "pork-knuckle", "brisket-burger", "shawarma-beef", "salmon-chowder", "san-sebastian",
  "большой-набор-мяса-из-печи", "томленая-говядина-с-мятым-картофелем", "ребра-из-печи", "рулька-из-печи", "бургер-с-рваной-говядиной", "шаверма-с-рваной-говядиной", "уха-на-сливках-с-диким-лососем", "чизкейк-сан-себастьян"
]);

export type WebsiteMenu = { categories: MenuCategory[]; items: Dish[] };
export async function getWebsiteMenu(): Promise<WebsiteMenu> {
  if (!db) throw new Error("Menu database is not configured");
  await syncSbisCatalog();
  const [categories, items, variants, sbisItems, links] = 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)),
    db.select().from(sbisCatalogItems),
    db.select({ menuItemId: menuItemSbisLinks.menuItemId, sbisId: menuItemSbisLinks.sbisId }).from(menuItemSbisLinks).where(isNull(menuItemSbisLinks.unlinkedAt))
  ]);
  const categoryById = new Map(categories.map((category) => [category.id, category]));
  const catalogBySbisId = new Map(sbisItems.map((catalogItem) => [catalogItem.sbisId, catalogItem]));
  const sbisByItemId = new Map(links.map((link) => [link.menuItemId, link.sbisId]));
  return { categories: categories.map((category) => ({ id: String(category.id), slug: category.slug, title: category.name, description: "", sort: category.sortOrder })), items: items.map((item) => { const category = categoryById.get(item.categoryId); const variant = variants.find((candidate) => candidate.itemId === item.id && candidate.isAvailable) || variants.find((candidate) => candidate.itemId === item.id); const sbisId = sbisByItemId.get(item.id); const sbis = sbisId ? catalogBySbisId.get(sbisId) : undefined; const hit = featuredHitSlugs.has(item.slug); const available = item.isAvailable && (sbis?.available ?? true); return { id: String(item.id), sbisId, slug: item.slug, name: item.name, shortDescription: item.shortDescription || item.description || "", fullDescription: item.description || "", categorySlug: category?.slug || "", categoryId: String(item.categoryId), price: sbis ? sbis.priceKopecks / 100 : variant ? variant.priceKopecks / 100 : 0, weight: item.weightText || variant?.label || "", unit: "", image: item.imageUrl || "/dishes/photo-soon.webp", imageAlt: item.name, gallery: [], hit, isHit: hit, showDetails: item.showDetails, restaurantAvailable: available, deliveryAvailable: available && item.allowDelivery && item.allowOnlineOrder && !item.isAlcohol, pickupAvailable: available && !item.isAlcohol, availableInRestaurant: available, availableForDelivery: available && item.allowDelivery && item.allowOnlineOrder && !item.isAlcohol, availableForPickup: available, temporarilyUnavailable: !available, stockLeft: sbis?.stockLeft ?? null, unavailableText: sbis?.unavailableText || "Позиция закончилась — уточняйте наличие у персонала.", sort: item.sortOrder, sortOrder: item.sortOrder, alcohol: item.isAlcohol, allergens: [], tags: [] }; }) };
}
