/**
 * Merchant (vendor) queries for customer-facing surfaces.
 *
 * "Featured" is approximated by totalSales desc (no isFeatured column yet).
 * Schema decision: add vendors.isFeatured boolean in a future round.
 *
 * Canonical location for listSubscribedClubsByUser → queries/club.ts.
 */

import { eq, and, inArray, desc } from 'drizzle-orm';
import type { DrizzleClient } from '../client.js';
import { vendors, favoriteVendors } from '../schema.js';
import { PUBLIC_VENDOR_STATES } from '@/server/catalog/_shared/predicates.js';

/**
 * Returns vendors favorited by a user, joined from favoriteVendors → vendors.
 * Returns empty array for guests (undefined userId).
 */
export async function listFavoritesByUser(
  db: DrizzleClient,
  userId: string | undefined,
  limit: number,
) {
  if (!userId) return [];
  const rows = await db
    .select({ vendor: vendors })
    .from(favoriteVendors)
    .innerJoin(vendors, eq(favoriteVendors.vendorId, vendors.id))
    .where(
      and(
        eq(favoriteVendors.userId, userId),
        inArray(vendors.accountState, [...PUBLIC_VENDOR_STATES]),
      ),
    )
    .orderBy(desc(favoriteVendors.createdAt))
    .limit(limit);
  return rows.map((r) => r.vendor);
}

/**
 * Returns all active/veteran vendors, paginated.
 */
export async function listAllMerchants(
  db: DrizzleClient,
  opts: { limit: number; offset?: number },
) {
  const q = db
    .select()
    .from(vendors)
    .where(inArray(vendors.accountState, [...PUBLIC_VENDOR_STATES]))
    .orderBy(desc(vendors.createdAt))
    .limit(opts.limit);
  if (opts.offset) {
    return q.offset(opts.offset);
  }
  return q;
}

/**
 * Returns vendors by list of IDs.
 * Returns empty array when ids is empty.
 */
export async function listByIds(db: DrizzleClient, ids: string[]) {
  if (ids.length === 0) return [];
  return db
    .select()
    .from(vendors)
    .where(and(inArray(vendors.id, ids), inArray(vendors.accountState, [...PUBLIC_VENDOR_STATES])));
}

/**
 * Returns top vendors by totalSales (proxy for "featured" until isFeatured column exists).
 */
export async function listFeaturedMerchants(db: DrizzleClient, limit: number) {
  return db
    .select()
    .from(vendors)
    .where(inArray(vendors.accountState, [...PUBLIC_VENDOR_STATES]))
    .orderBy(desc(vendors.totalSales))
    .limit(limit);
}
