export const prerender = false;

import type { APIRoute } from 'astro';
import { env } from 'cloudflare:workers';
import { and, eq } from 'drizzle-orm';
import type { Querier } from '@platform-modules/db';
import { variant, variantPrice } from '@platform-modules/commerce-catalog';
import { applyToCart } from '@platform-modules/commerce-cart';
import { getSession, type SessionEnv } from '../../../lib/session.js';
import { getDb, type DbEnv } from '../../../lib/db.js';
import { createStorefrontCartStore } from '../../../lib/cart-store.js';
import { getStoreSettings } from '../../../lib/settings.js';
import { type AuthEnv } from '../../../lib/auth-engine.js';
import { type StorefrontLimiterEnv } from '../../../lib/rate-limit.js';

export const POST: APIRoute = async ({ request, cookies, redirect }) => {
  const cfEnv = env as (AuthEnv & SessionEnv & DbEnv & StorefrontLimiterEnv) | undefined;

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

  const formData = await request.formData();
  const variantId = String(formData.get('variantId') ?? '');
  const qty = parseInt(String(formData.get('qty') ?? '1'), 10);
  const vendorId = formData.get('vendorId');

  const { db } = getDb(cfEnv!);
  const { currency } = await getStoreSettings(db as unknown as Querier);

  const [variantRow] = await db.select().from(variant).where(eq(variant.id, variantId)).limit(1);
  if (!variantRow) {
    return redirect('/cart?error=invalid_variant', 302);
  }

  const [priceRow] = await db
    .select()
    .from(variantPrice)
    .where(and(eq(variantPrice.variantId, variantId), eq(variantPrice.currency, currency)))
    .limit(1);

  if (!priceRow) {
    return redirect('/cart?error=invalid_variant', 302);
  }

  const store = createStorefrontCartStore(db);

  await applyToCart(store, session.userId, {
    type: 'addLine',
    variantId,
    qty,
    price: {
      amount: priceRow.amount,
      currency: priceRow.currency,
      priceMode: priceRow.priceMode,
    },
    vendorId: typeof vendorId === 'string' ? vendorId : null,
  });

  return redirect('/cart', 302);
};
