import { NextRequest, NextResponse } from "next/server";
import { z } from "zod";
import { prisma } from "@/lib/prisma";
import { analyzeBilan, type BilanAnswers } from "@/lib/analysis";
import { generatePppPdf } from "@/lib/pdf";
import { savePdf } from "@/lib/storage";

const bodySchema = z.object({
  slug: z.string().min(1),
  answers: z.record(z.string(), z.union([z.string(), z.array(z.string())])),
});

export async function POST(req: NextRequest) {
  const parsed = bodySchema.safeParse(await req.json().catch(() => null));
  if (!parsed.success) {
    return NextResponse.json({ error: "Requête invalide." }, { status: 400 });
  }
  const { slug, answers } = parsed.data;

  const pharmacy = await prisma.pharmacy.findUnique({ where: { slug } });
  if (!pharmacy || pharmacy.status !== "ACTIVE") {
    return NextResponse.json({ error: "Pharmacie introuvable ou inactive." }, { status: 404 });
  }

  const typedAnswers = answers as unknown as BilanAnswers;
  const analysis = analyzeBilan(typedAnswers);

  const patientFirstName = (answers.prenom as string) || null;
  const patientLastName = (answers.nom as string) || null;
  const ageRange = (answers.age as string) || null;
  const patientName = [patientFirstName, patientLastName].filter(Boolean).join(" ") || "Patient";

  const bilan = await prisma.bilan.create({
    data: {
      pharmacyId: pharmacy.id,
      patientFirstName,
      patientLastName,
      ageRange,
      answers: answers as object,
      analysis: analysis as unknown as object,
      priorityCount: analysis.priorities.length,
      highPriorityCount: analysis.priorities.filter((p) => p.level === "high").length,
    },
  });

  try {
    const pdfBuffer = await generatePppPdf({
      pharmacyName: pharmacy.name,
      patientName,
      ageRange: ageRange ?? undefined,
      analysis,
    });
    const filename = `${bilan.id}.pdf`;
    await savePdf(filename, pdfBuffer);
    await prisma.bilan.update({ where: { id: bilan.id }, data: { pdfUrl: filename } });
  } catch (err) {
    // La synthèse reste consultable dans le dashboard même si la génération PDF échoue ;
    // on ne bloque pas la confirmation patient pour autant.
    console.error("Échec de génération du PDF pour le bilan", bilan.id, err);
  }

  return NextResponse.json({ ok: true });
}
