import { createHash, timingSafeEqual } from 'node:crypto';
/** Payment adapter intentionally fails closed until credentials/provider are configured. */
export async function createCheckout(input: { orderId: string; amount: number; donorName: string; message: string; streamerSlug: string }) {
  const provider = process.env.PAYMENT_PROVIDER;
  if (provider !== 'midtrans' || !process.env.MIDTRANS_SERVER_KEY) {
    return { enabled: false as const, message: 'Pembayaran belum diaktifkan. Pemilik platform perlu mengonfigurasi provider dan kredensial merchant resmi.' };
  }
  // Snap checkout creation: server key is server-side only; never expose it to browsers.
  const production = process.env.MIDTRANS_IS_PRODUCTION === 'true';
  const base = production ? 'https://app.midtrans.com' : 'https://app.sandbox.midtrans.com';
  const auth = Buffer.from(`${process.env.MIDTRANS_SERVER_KEY}:`).toString('base64');
  const response = await fetch(`${base}/snap/v1/transactions`, {
    method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json', Authorization: `Basic ${auth}` },
    body: JSON.stringify({ transaction_details: { order_id: input.orderId, gross_amount: input.amount }, customer_details: { first_name: input.donorName }, item_details: [{ id: `donation-${input.streamerSlug}`, price: input.amount, quantity: 1, name: `Donasi untuk ${input.streamerSlug}` }], custom_field1: input.streamerSlug, custom_field2: input.message.slice(0, 50) }),
  });
  if (!response.ok) throw new Error(`Payment provider rejected checkout (${response.status}).`);
  const data = await response.json() as { token?: string; redirect_url?: string };
  if (!data.redirect_url) throw new Error('Payment provider did not return a checkout URL.');
  return { enabled: true as const, checkoutUrl: data.redirect_url, token: data.token ?? null };
}
export function verifyMidtransSignature(body: { order_id?: string; status_code?: string; gross_amount?: string; signature_key?: string }) {
  const key = process.env.MIDTRANS_SERVER_KEY;
  if (!key || !body.order_id || !body.status_code || !body.gross_amount || !body.signature_key) return false;
  const expected = createHash('sha512').update(`${body.order_id}${body.status_code}${body.gross_amount}${key}`).digest('hex');
  const a = Buffer.from(expected); const b = Buffer.from(body.signature_key);
  return a.length === b.length && timingSafeEqual(a, b);
}
