"use server";

import { eq } from "drizzle-orm";
import { headers } from "next/headers";
import { redirect } from "next/navigation";
import { verifySession } from "@/lib/session";
import { appDb, schema } from "@/lib/appdb";
import { URUNLER } from "@/lib/credits";
import { initializeCheckoutForm } from "@/lib/iyzico";

export type OdemeBaslatDurum = { error?: string } | undefined;

export async function baslatOdeme(
  _prev: OdemeBaslatDurum,
  formData: FormData,
): Promise<OdemeBaslatDurum> {
  // Ucuz senkron doğrulama pahalı oturum turundan önce
  const product = formData.get("urun");
  if (product !== "paket" && product !== "topup") {
    return { error: "Geçersiz ürün." };
  }
  const session = await verifySession("/paket");
  const urun = URUNLER[product];

  const orderId = crypto.randomUUID();
  await appDb.insert(schema.orders).values({
    id: orderId,
    userId: session.user.id,
    product,
    amountKurus: urun.amountKurus,
    credits: urun.credits,
    status: "pending",
    createdAt: new Date(),
  });

  const h = await headers();
  const buyerIp =
    h.get("x-forwarded-for")?.split(",")[0]?.trim() ?? "85.34.78.112";
  const appUrl = process.env.NEXT_PUBLIC_APP_URL ?? "http://localhost:3000";

  let init;
  try {
    init = await initializeCheckoutForm({
      orderId,
      fiyatKurus: urun.amountKurus,
      urunAdi: `KolayTercih — ${urun.label}`,
      email: session.user.email,
      userId: session.user.id,
      callbackUrl: `${appUrl}/api/odeme/callback`,
      buyerIp,
    });
  } catch (err) {
    if (err instanceof Error && err.message === "IYZICO_KEYS_MISSING") {
      // Yapılandırma detayı log'a; kullanıcıya altyapı sızdırmayan mesaj
      console.error("[odeme] iyzico anahtarları eksik — ödeme başlatılamadı");
      return {
        error:
          "Ödeme şu anda başlatılamıyor; kartından çekim yapılmadı. Birazdan tekrar dener misin?",
      };
    }
    throw err;
  }

  if (init.status !== "success" || !init.paymentPageUrl || !init.token) {
    return {
      error: init.errorMessage ?? "Ödeme başlatılamadı. Tekrar dener misin?",
    };
  }

  await appDb
    .update(schema.orders)
    .set({ iyzicoToken: init.token })
    .where(eq(schema.orders.id, orderId));

  redirect(init.paymentPageUrl);
}
