import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { getClientIp } from "@/lib/auth";
import { escapeHtml, mailCode, mailShell, sendToolaroMail } from "@/lib/mail";
import { checkRateLimit, hashIp, randomCode, sha256, verifyPassword } from "@/lib/security";

export async function POST(request: Request) {
  const body = (await request.json()) as { email?: string; password?: string };
  const email = String(body.email ?? "").trim().toLowerCase();
  const password = String(body.password ?? "");
  const ip = getClientIp();
  const key = `${ip}:${email}`;

  const limited = await checkRateLimit({ key, action: "login", limit: 8, windowSeconds: 60 * 15 });
  if (!limited.ok) return NextResponse.json({ ok: false, error: "Zu viele Login-Versuche. Bitte später erneut versuchen." }, { status: 429 });

  const user = await prisma.user.findUnique({ where: { email } });
  if (!user || !(await verifyPassword(password, user.passwordHash))) {
    return NextResponse.json({ ok: false, error: "E-Mail oder Passwort ist falsch." }, { status: 401 });
  }
  if (!user.emailVerifiedAt) {
    return NextResponse.json({ ok: false, error: "Bitte bestätige zuerst deine E-Mail-Adresse." }, { status: 403 });
  }

  const resendLimit = await checkRateLimit({ key: user.id, action: "2fa-send", limit: 4, windowSeconds: 60 * 10 });
  if (!resendLimit.ok) return NextResponse.json({ ok: false, error: "Zu viele 2FA-Codes angefordert." }, { status: 429 });

  const code = randomCode(6);
  const challenge = await prisma.twoFactorCode.create({
    data: {
      userId: user.id,
      codeHash: sha256(code),
      expiresAt: new Date(Date.now() + 1000 * 60 * 8),
      requestedIpHash: hashIp(ip),
    },
  });

  await sendToolaroMail({
    to: user.email,
    subject: "Toolaro – Dein Login-Code",
    html: mailShell(
      "Dein Login-Code",
      `${user.name ? `<p style="margin:0 0 16px;font-size:17px;font-weight:bold;color:#1a1a2e;">Hallo ${escapeHtml(user.name)}!</p>` : ""}
       <p style="margin:0 0 4px;">Dein Einmal-Code zum Einloggen lautet:</p>
       ${mailCode(code)}
       <p style="margin:16px 0 0;font-size:13px;color:#4a5568;">Der Code ist <strong>8 Minuten</strong> gültig und kann nur einmal verwendet werden.<br>Falls du den Login nicht angefordert hast, ignoriere diese E-Mail – dein Konto ist sicher.</p>`,
      `Dein Toolaro Login-Code: ${code}`
    ),
    text: `Dein Toolaro Login-Code lautet: ${code}\nDer Code ist 8 Minuten gültig und kann nur einmal verwendet werden.`,
  });

  await prisma.securityLog.create({ data: { userId: user.id, event: "2fa_sent", ipHash: hashIp(ip) } });
  return NextResponse.json({ ok: true, challengeId: challenge.id, message: "2FA-Code wurde per E-Mail gesendet." });
}
