"use server";

import { z } from "zod";
import { eq } from "drizzle-orm";
import { db, schema } from "@/lib/db";
import {
  createPasswordResetToken,
  setPasswordWithToken,
} from "@/lib/auth-tokens";
import { sendPasswordResetEmail } from "@/lib/email";

const requestInput = z.object({
  email: z.string().email("Email invalide"),
});

export async function requestPasswordReset(input: {
  email: string;
}): Promise<{ ok: true } | { ok: false; error: string }> {
  const parsed = requestInput.safeParse(input);
  if (!parsed.success) {
    return { ok: false, error: "Email invalide." };
  }
  const email = parsed.data.email.toLowerCase().trim();

  const u = (
    await db
      .select()
      .from(schema.user)
      .where(eq(schema.user.email, email))
      .limit(1)
  )[0];

  // Pour ne PAS révéler si l'email existe : on renvoie toujours ok=true.
  // (Standard de sécurité : pas d'énumération de comptes.)
  if (!u) return { ok: true };

  try {
    const token = await createPasswordResetToken(u.id);
    const baseUrl = process.env.BETTER_AUTH_URL ?? "http://localhost:3001";
    const setUrl = `${baseUrl}/set-password?token=${token}&uid=${u.id}`;

    await sendPasswordResetEmail({
      to: u.email,
      clientName: u.name,
      setUrl,
      isInitialSetup: false,
    });
  } catch (err) {
    console.error("[requestPasswordReset] failed:", err);
    // On garde ok=true pour ne pas leak l'erreur côté UX.
  }

  return { ok: true };
}

const confirmInput = z.object({
  userId: z.string().min(1),
  token: z.string().min(10),
  newPassword: z.string().min(10, "Mot de passe trop court (10 caractères min)."),
});

export async function confirmPasswordReset(input: {
  userId: string;
  token: string;
  newPassword: string;
}): Promise<{ ok: true } | { ok: false; error: string }> {
  const parsed = confirmInput.safeParse(input);
  if (!parsed.success) {
    return {
      ok: false,
      error: parsed.error.issues[0]?.message ?? "Données invalides",
    };
  }
  return setPasswordWithToken(
    parsed.data.userId,
    parsed.data.token,
    parsed.data.newPassword
  );
}
