'use server';

import { redirect } from 'next/navigation';
import { prisma } from '@/lib/prisma';
import { sendProofEmail } from '@/lib/mail';

export async function createProof(formData: FormData) {
  const productId = String(formData.get('productId') ?? '');
  const customerName = String(formData.get('customerName') ?? '').trim();
  const customerEmail = String(formData.get('customerEmail') ?? '').trim();
  const color = String(formData.get('color') ?? '');
  const quantity = Math.max(1, Number(formData.get('quantity') ?? 1));
  const note = String(formData.get('note') ?? '').trim();
  const priceOverride = formData.get('price');
  const file = formData.get('image') as File | null;

  if (!productId || !customerEmail || !color || !file || file.size === 0) {
    throw new Error('Missing required fields: product, customer email, color, and an image are all required.');
  }

  const product = await prisma.product.findUnique({ where: { id: productId } });
  if (!product) throw new Error('Product not found.');

  const bytes = Buffer.from(await file.arrayBuffer());
  const mimeType = file.type || 'image/png';
  const imageDataUrl = `data:${mimeType};base64,${bytes.toString('base64')}`;

  const unitPrice = priceOverride && String(priceOverride).trim() !== ''
    ? Math.round(Number(priceOverride) * 100)
    : product.basePrice;

  const proof = await prisma.designProof.create({
    data: {
      productId,
      customerName: customerName || null,
      customerEmail,
      color,
      quantity,
      unitPrice,
      imageDataUrl,
      note: note || null,
    },
  });

  const siteUrl = process.env.NEXT_PUBLIC_SITE_URL ?? 'http://localhost:3000';
  const link = `${siteUrl}/proofs/${proof.id}`;

  const result = await sendProofEmail({
    to: customerEmail,
    customerName: customerName || null,
    link,
    productName: product.name,
    note: note || null,
  });

  redirect(`/admin/proofs/${proof.id}/sent?emailed=${result.sent ? '1' : '0'}`);
}
