export const prerender = false;

import type { APIRoute } from 'astro';
import { env } from 'cloudflare:workers';
import type { Querier } from '@platform-modules/db';
import { fulfillOrder } from '@platform-modules/commerce-fulfillment';
import { getOrderById, type OrdersSchema } from '@platform-modules/commerce-orders';
import { getSession, type SessionEnv } from '../../../../../lib/session.js';
import { getTransactionalDb, type DbEnv } from '../../../../../lib/db.js';
import { type AuthEnv } from '../../../../../lib/auth-engine.js';
import { type StorefrontLimiterEnv } from '../../../../../lib/rate-limit.js';
import {
  createStorefrontFulfillmentPorts,
  createR2StorageAdapter,
  createNoOpStorageAdapter,
} from '../../../../../lib/fulfillment.js';

type FulfillEnv = AuthEnv & SessionEnv & DbEnv & StorefrontLimiterEnv & { MEDIA?: R2Bucket };

const ADMIN_ACTOR = { isAdmin: true as const };

export const POST: APIRoute = async ({ cookies, params, redirect }) => {
  const cfEnv = env as FulfillEnv | undefined;

  const session = cfEnv ? await getSession(cfEnv, cookies) : null;
  if (!session || session.role !== 'owner') {
    return redirect('/admin/login', 302);
  }

  const id = params.id ?? '';
  const { db } = getTransactionalDb(cfEnv!);

  const order = await getOrderById(db as unknown as Querier<OrdersSchema>, id, ADMIN_ACTOR);
  if (!order) {
    return redirect('/admin/orders', 302);
  }
  if (order.status !== 'paid') {
    return redirect(`/admin/orders/${id}?error=order_not_paid`, 302);
  }

  const storage = cfEnv?.MEDIA ? createR2StorageAdapter(cfEnv.MEDIA) : createNoOpStorageAdapter();
  const fulfillmentPorts = createStorefrontFulfillmentPorts(
    db as unknown as import('@platform-modules/db').TransactionalDatabase<import('@platform-modules/commerce-fulfillment').FulfillmentDbSchema>,
    storage,
  );

  await fulfillOrder(fulfillmentPorts, order);

  return redirect(`/admin/orders/${id}?fulfilled=1`, 302);
};
