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),
  logoUrl: z.string().nullable().optional(),
  description: z.string().nullable().optional(),
  value: z.number().nonnegative(),
  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) 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);
}

export async function GET() {
  const admin = await requireAdmin();
  if (!admin) return unauthorized();
  const plans = await prisma.socioPlan.findMany({ orderBy: [{ sortOrder: "asc" }, { createdAt: "desc" }] });
  return NextResponse.json(plans);
}

export async function POST(req: Request) {
  const admin = await requireAdmin();
  if (!admin) return unauthorized();

  const json = await req.json();
  const body = schema.parse(json);

  const benefits = normalizeBenefits(body.benefits);

  const plan = await prisma.socioPlan.create({
    data: {
      name: body.name,
      logoUrl: body.logoUrl ?? null,
      description: body.description ?? null,
      valueCents: Math.round(body.value * 100),
      benefits: benefits as unknown as Prisma.JsonArray, // Prisma Json input
      active: body.active ?? true,
      sortOrder: body.sortOrder ?? 0,
    },
  });

  return NextResponse.json(plan);
}

