import crypto from "crypto"

import { render } from "@react-email/render"
import { NextResponse } from "next/server"

import { prisma } from "@/lib/prisma"
import { sendSmtpMail } from "@/server/email-smtp"
import SimpleNotificationEmail from "../../../../../emails/simple-notification-email"

function getSmtpConfig() {
  const host = process.env.SMTP_HOST ?? process.env.SMTP_ADDRESS
  const port = process.env.SMTP_PORT
  const username = process.env.SMTP_USER ?? process.env.SMTP_USERNAME
  const password = process.env.SMTP_PASS ?? process.env.SMTP_PASSWORD
  const fromEmail = process.env.SMTP_FROM_EMAIL ?? process.env.MAILER_SENDER_EMAIL
  const fromName = process.env.SMTP_FROM_NAME ?? "Raven"

  if (!host || !port || !username || !password || !fromEmail) return null

  return {
    host,
    port: Number(port),
    username,
    password,
    from: `"${fromName}" <${fromEmail}>`,
    tls: process.env.SMTP_SECURE === "true",
    starttls: process.env.SMTP_SECURE !== "true",
    rejectUnauthorized: false,
    timeoutMs: 15000,
  }
}

export async function POST(request: Request) {
  try {
    const body = await request.json()
    const { email } = body

    if (!email || typeof email !== "string") {
      return NextResponse.json({ error: "E-mail é obrigatório" }, { status: 400 })
    }

    const normalizedEmail = email.toLowerCase().trim()

    // Busca o usuário pelo e-mail (sem revelar se existe ou não por segurança)
    const user = await prisma.authUser.findFirst({
      where: { email: normalizedEmail },
    })

    // Sempre retorna sucesso para não revelar se o e-mail existe
    if (!user) {
      return NextResponse.json({ success: true })
    }

    // Gera um token seguro
    const token = crypto.randomBytes(32).toString("hex")
    const expiresAt = new Date(Date.now() + 60 * 60 * 1000) // 1 hora

    // Remove tokens anteriores do mesmo usuário
    await prisma.authVerification.deleteMany({
      where: {
        identifier: `password-reset:${user.id}`,
      },
    })

    // Salva o novo token
    await prisma.authVerification.create({
      data: {
        identifier: `password-reset:${user.id}`,
        value: token,
        expiresAt,
      },
    })

    // Envia o e-mail
    const smtp = getSmtpConfig()
    if (!smtp) {
      console.error("[FORGOT_PASSWORD] SMTP não configurado")
      return NextResponse.json({ success: true }) // Não revela erro de configuração
    }

    const baseUrl = process.env.NEXT_PUBLIC_APP_URL ?? "https://tickets.esdrasrenan.com.br"
    const resetUrl = `${baseUrl}/redefinir-senha?token=${token}`

    const html = await render(
      SimpleNotificationEmail({
        title: "Redefinição de Senha",
        message: `Olá, ${user.name ?? "usuário"}!\n\nRecebemos uma solicitação para redefinir a senha da sua conta.\n\nSe você não fez essa solicitação, pode ignorar este e-mail com segurança.\n\nEste link expira em 1 hora.`,
        ctaLabel: "Redefinir Senha",
        ctaUrl: resetUrl,
      }),
      { pretty: true }
    )

    await sendSmtpMail(smtp, normalizedEmail, "Redefinição de Senha - Raven", html)

    return NextResponse.json({ success: true })
  } catch (error) {
    console.error("[FORGOT_PASSWORD] Erro:", error)
    return NextResponse.json({ error: "Erro ao processar solicitação" }, { status: 500 })
  }
}
