import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { requireAdmin, unauthorized } from "@/lib/admin-api";
import { z } from "zod";
import type { Prisma } from "@prisma/client";

const schema = z.object({
  name: z.string().min(2).optional(),
  logoUrl: z.string().nullable().optional(),
  description: z.string().nullable().optional(),
  value: z.number().nonnegative().optional(),
  benefits: z.union([z.string(), z.array(z.string())]).optional(),
  active: z.boolean().optional(),
  sortOrder: z.number().int().optional(),
});

function normalizeBenefits(v: unknown): string[] {
  if (v == null) return [];
  if (Array.isArray(v)) return v.map((s) => String(s).trim()).filter(Boolean);
  return String(v)
    .split(/\r?\n/g)
    .map((s) => s.trim())
    .filter(Boolean);
}

type Ctx = { params: Promise<{ id: string }> };

export async function PATCH(req: Request, ctx: Ctx) {
  const admin = await requireAdmin();
  if (!admin) return unauthorized();

  const { id } = await ctx.params;
  const json = await req.json();
  const body = schema.parse(json);

  const data: any = {};
  if (body.name !== undefined) data.name = body.name;
  if (body.logoUrl !== undefined) data.logoUrl = body.logoUrl;
  if (body.description !== undefined) data.description = body.description;
  if (body.value !== undefined) data.valueCents = Math.round(body.value * 100);
  if (body.benefits !== undefined) {
    const benefits = normalizeBenefits(body.benefits) as unknown as Prisma.JsonArray;
    data.benefits = benefits;
  }
  if (body.active !== undefined) data.active = body.active;
  if (body.sortOrder !== undefined) data.sortOrder = body.sortOrder;

  const plan = await prisma.socioPlan.update({
    where: { id },
    data,
  });
  return NextResponse.json(plan);
}

export async function DELETE(_req: Request, ctx: Ctx) {
  const admin = await requireAdmin();
  if (!admin) return unauthorized();

  const { id } = await ctx.params;
  await prisma.socioPlan.delete({ where: { id } });
  return NextResponse.json({ ok: true });
}

