export const prerender = false;

import type { APIRoute } from 'astro';
import { env } from 'cloudflare:workers';
import type { Querier } from '@platform-modules/db';
import { stripe } from '@platform-modules/billing/stripe';
import {
  startCheckout,
  isCheckoutValidationError,
  type CheckoutDeps,
  type OrdersSchema,
} from '@platform-modules/commerce-checkout';
import type { FulfillmentDbSchema } from '@platform-modules/commerce-fulfillment';
import { appendEntry } from '@platform-modules/ledger';
import type { LedgerSeam } from '@platform-modules/billing';
import { getTransactionalDb, type DbEnv } from '../../../lib/db.js';
import { getSession, type SessionEnv } from '../../../lib/session.js';
import { getStoreSettings } from '../../../lib/settings.js';
import { createStorefrontCartStore } from '../../../lib/cart-store.js';
import { createDbIntentStore } from '../../../lib/checkout-store.js';
import {
  createStorefrontFulfillmentPorts,
  createR2StorageAdapter,
  createNoOpStorageAdapter,
} from '../../../lib/fulfillment.js';
import { type AuthEnv } from '../../../lib/auth-engine.js';
import { type StorefrontLimiterEnv } from '../../../lib/rate-limit.js';

type CheckoutEnv = AuthEnv & SessionEnv & DbEnv & StorefrontLimiterEnv & {
  STRIPE_SECRET_KEY?: string;
  MEDIA?: R2Bucket;
};

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

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

  const formData = await request.formData();
  const buyerCountry = String(formData.get('buyerCountry') ?? '');
  const idempotencyKeyRaw = formData.get('idempotencyKey');
  if (!idempotencyKeyRaw) {
    return redirect('/checkout?error=invalid_request', 302);
  }
  const idempotencyKey = String(idempotencyKeyRaw);

  const { db } = getTransactionalDb(cfEnv!);

  const store = createStorefrontCartStore(db);
  const cart = await store.load(session.userId);

  if (!cart || cart.lines.length === 0) {
    return redirect('/checkout?error=empty_cart', 302);
  }

  const { priceMode, currency } = await getStoreSettings(db as unknown as Querier);
  const namespacedKey = session.userId + ':' + idempotencyKey;

  const ledger: LedgerSeam = { appendEntry: appendEntry as LedgerSeam['appendEntry'] };
  const storage = cfEnv?.MEDIA ? createR2StorageAdapter(cfEnv.MEDIA) : createNoOpStorageAdapter();
  const fulfillment = createStorefrontFulfillmentPorts(
    db as unknown as import('@platform-modules/db').TransactionalDatabase<FulfillmentDbSchema>,
    storage,
  );

  const deps = {
    db,
    provider: stripe({ secretKey: cfEnv!.STRIPE_SECRET_KEY }),
    intentStore: createDbIntentStore(db as unknown as Querier),
    ledger,
    fulfillment,
  } as unknown as CheckoutDeps<OrdersSchema>;

  const input = {
    idempotencyKey: namespacedKey,
    buyerRef: { userId: session.userId },
    priceMode,
    currency,
    buyerCountry,
    cart,
  } as Parameters<typeof startCheckout>[1];

  try {
    const result = await startCheckout(deps, input);
    return redirect(`/checkout/${result.orderId}/confirm`, 302);
  } catch (e) {
    if (isCheckoutValidationError(e)) {
      return redirect(`/checkout?error=${(e as { reason: string }).reason}`, 302);
    }
    return redirect('/checkout?error=payment_failed', 302);
  }
};
