import { eq } from 'drizzle-orm';
import type { DrizzleClient } from '@/server/db/client';
import type { LoadCtx } from '@/server/page-layout/types';
import type { Config } from './config';
import {
  listByCategory,
  listByCustomFilters,
  listWishlistByUser,
} from '@/server/catalog/public/browse';
import { listDealsByIds } from '@/server/catalog/public/detail';
import { toDealCardDeal } from '@/features/feed/FeedDataLoader';
import { captureCaught } from '@/server/observability/capture.server';

/**
 * Resolve a slug (e.g. 'meal') to a dealCategory UUID by matching
 * dealType text field (stored uppercase: MEAL, BAKERY, etc.).
 * Returns undefined if not found.
 */
async function resolveSlugToCategoryId(
  db: DrizzleClient,
  slug: string,
): Promise<string | undefined> {
  try {
    const { dealCategories } = await import('@/server/db/schema');
    const rows = await db
      .select({ id: dealCategories.id })
      .from(dealCategories)
      .where(eq(dealCategories.dealType, slug.toUpperCase()))
      .limit(1);
    return rows[0]?.id;
  } catch (err) {
    captureCaught(err, {
      scope: 'server.page-layout.modules.deal-grid.loadData',
      severity: 'warning',
    });
    return undefined;
  }
}

export async function loadData(db: DrizzleClient, config: Config, ctx: LoadCtx) {
  try {
    switch (config.source) {
      case 'wishlist': {
        const rows = await listWishlistByUser(db, ctx.userId, config.limit);
        // listWishlistByUser returns raw deal rows — map to DealCardDeal
        return rows.map((r) => toDealCardDeal(r as Parameters<typeof toDealCardDeal>[0]));
      }

      case 'category': {
        const slug = ctx.routeParams?.slug ?? '';
        const categoryId = await resolveSlugToCategoryId(db, slug);
        if (!categoryId) return [];
        const rows = await listByCategory(db, categoryId, config.limit);
        return rows.map((r) => toDealCardDeal(r as Parameters<typeof toDealCardDeal>[0]));
      }

      case 'ids': {
        const rows = await listDealsByIds(db, config.ids ?? []);
        return rows.map((r) => toDealCardDeal(r as Parameters<typeof toDealCardDeal>[0]));
      }

      case 'custom-query':
      default: {
        const rows = await listByCustomFilters(
          db,
          config.filters ?? {},
          config.sort ?? 'recent',
          config.limit,
        );
        return rows.map((r) => toDealCardDeal(r as Parameters<typeof toDealCardDeal>[0]));
      }
    }
  } catch (err) {
    captureCaught(err, {
      scope: 'server.page-layout.modules.deal-grid.loadData',
      severity: 'warning',
    });
    return null;
  }
}
