import type { DrizzleClient } from '@/server/db/client';
import * as vendorQueries from '@/server/db/queries/vendors';

export type VendorAccountUpdatedEvent = {
  id: string;
  chargesEnabled: boolean;
  payoutsEnabled: boolean;
  detailsSubmitted: boolean;
  requirementsCurrentlyDue: string[] | null;
};

export async function applyVendorAccountUpdated(
  db: DrizzleClient,
  account: VendorAccountUpdatedEvent,
): Promise<{ vendorId: string; activated: boolean } | null> {
  const vendor = await vendorQueries.getVendorByStripeAccountId(db, account.id);
  if (!vendor) return null;
  await vendorQueries.setVendorStripeStatus(db, vendor.id, {
    stripeChargesEnabled: account.chargesEnabled,
    stripePayoutsEnabled: account.payoutsEnabled,
    stripeDetailsSubmitted: account.detailsSubmitted,
    stripeRequirementsCurrentlyDue: account.requirementsCurrentlyDue,
    stripeOnboardingState: account.chargesEnabled
      ? 'charges_enabled'
      : account.detailsSubmitted
        ? 'kyc_pending'
        : 'account_created',
  });
  const activated =
    account.chargesEnabled && vendor.accountState === 'PENDING_PROCESSOR'
      ? await vendorQueries.activateVendorOnChargesEnabled(db, vendor.id)
      : false;
  return { vendorId: vendor.id, activated };
}
