import { createDbService } from '@/server/services/db.js';
import { and, asc, eq } from 'drizzle-orm';
import { order, orderStep } from '../db/schema.js';
import { completeFulfilledOrder } from '../db/queries/cron-boundary.js';
import type { MultidealEnv } from '../env.js';
import { businessDaysBetween } from '../workflows/refund.js';

const GRACE_BUSINESS_DAYS = 5;
const BATCH_LIMIT = 100;

export async function completeFulfilledOrders(env: MultidealEnv): Promise<number> {
  const db = createDbService({ DATABASE_URL: env.DATABASE_URL });
  const now = new Date();

  const candidates = await db
    .select({
      orderId: order.id,
      fulfilledAt: orderStep.createdAt,
    })
    .from(order)
    .innerJoin(orderStep, and(eq(orderStep.orderId, order.id), eq(orderStep.stepId, 'fulfilled')))
    .where(eq(order.status, 'fulfilled'))
    .orderBy(asc(orderStep.createdAt))
    .limit(BATCH_LIMIT);

  let completed = 0;
  for (const candidate of candidates) {
    if (businessDaysBetween(candidate.fulfilledAt, now) < GRACE_BUSINESS_DAYS) {
      continue;
    }

    if (await completeFulfilledOrder(db, candidate.orderId, now)) {
      completed++;
    }
  }

  return completed;
}
