/**
 * Vendor feed queries — outbox events scoped to a single vendor.
 *
 * Uses `aggregate_type = 'vendor' AND aggregate_id = vendorId` filter.
 * Leverages the composite index outbox_aggregate_feed_idx for efficient lookups.
 *
 * P0 scope: direct vendor-aggregate events only (aggregate_type='vendor').
 * Purchase/deal events joined via deal→vendor will be added in a later task.
 */

import { and, desc, eq, inArray } from 'drizzle-orm';
import type { DrizzleClient } from '../client.js';
import { outbox } from '../schema.js';

// ─── Types ────────────────────────────────────────────────────────────────────

export type VendorFeedEvent = typeof outbox.$inferSelect;

/**
 * Vendor event types served to the dashboard activity feed.
 *
 * Whitelist ensures unrelated aggregate events never leak into the feed
 * even if aggregate_type/aggregate_id collide.
 */
export const VENDOR_FEED_EVENT_TYPES = [
  'vendor.deal.tier_passed',
  'vendor.deal.critical_window',
  'vendor.purchase.redeemed',
  'vendor.purchase.refunded',
  'vendor.review.received',
  'vendor.account.approved',
  'vendor.account.frozen',
  'vendor.account.unfrozen',
  'vendor.account.rejected',
] as const;

export type VendorFeedEventType = (typeof VENDOR_FEED_EVENT_TYPES)[number];

export interface ListVendorFeedEventsOptions {
  /** Max events to return. Default: 25. */
  limit?: number;
  /** Restrict to specific event types. Default: all VENDOR_FEED_EVENT_TYPES. */
  eventTypes?: VendorFeedEventType[];
}

// ─── Queries ──────────────────────────────────────────────────────────────────

/**
 * List recent outbox events for a vendor's activity feed.
 *
 * Filter: aggregate_type = 'vendor' AND aggregate_id = vendorId.
 * Uses optional event-type whitelist (defaults to all VENDOR_FEED_EVENT_TYPES).
 * Orders by created_at DESC — newest first.
 */
export async function listVendorFeedEvents(
  db: DrizzleClient,
  vendorId: string,
  options: ListVendorFeedEventsOptions = {},
): Promise<VendorFeedEvent[]> {
  const limit = options.limit ?? 25;
  const eventTypes = options.eventTypes ?? [...VENDOR_FEED_EVENT_TYPES];

  return db
    .select()
    .from(outbox)
    .where(
      and(
        eq(outbox.aggregateType, 'vendor'),
        eq(outbox.aggregateId, vendorId),
        inArray(outbox.eventType, eventTypes),
      ),
    )
    .orderBy(desc(outbox.createdAt))
    .limit(limit);
}
