import { NextResponse } from 'next/server';
import { z } from 'zod';
import { prisma } from '@/lib/prisma';
import { requireAdmin } from '@/lib/require-admin';

const testimonialUpdateInput = z.object({
  authorName: z.string().optional(),
  authorRole: z.string().optional(),
  companyName: z.string().optional(),
  published: z.boolean().optional(),
  translations: z
    .object({
      fr: z.object({ quote: z.string() }).optional(),
      ar: z.object({ quote: z.string() }).optional()
    })
    .optional()
});

export async function PATCH(req: Request, { params }: { params: { id: string } }) {
  const { response } = await requireAdmin();
  if (response) return response;

  const parsed = testimonialUpdateInput.safeParse(await req.json().catch(() => null));
  if (!parsed.success) {
    return NextResponse.json({ error: 'invalid_payload', issues: parsed.error.issues }, { status: 400 });
  }
  const data = parsed.data;

  for (const locale of ['fr', 'ar'] as const) {
    const t = data.translations?.[locale];
    if (t) {
      await prisma.testimonialTranslation.upsert({
        where: { testimonialId_locale: { testimonialId: params.id, locale } },
        update: t,
        create: { testimonialId: params.id, locale, ...t }
      });
    }
  }

  const testimonial = await prisma.testimonial.update({
    where: { id: params.id },
    data: {
      authorName: data.authorName,
      authorRole: data.authorRole,
      companyName: data.companyName,
      published: data.published
    }
  });
  return NextResponse.json(testimonial);
}

export async function DELETE(_req: Request, { params }: { params: { id: string } }) {
  const { response } = await requireAdmin();
  if (response) return response;
  await prisma.testimonial.delete({ where: { id: params.id } });
  return NextResponse.json({ ok: true });
}
