"use server"

import { db } from "@/lib/db"
import { slugify } from "@/lib/utils"
import { revalidatePath } from "next/cache"
import { redirect } from "next/navigation"
import { z } from "zod"

const productSchema = z.object({
  name: z.string().min(1),
  description: z.string().min(1),
  price: z.coerce.number().int().min(0),
  stock: z.coerce.number().int().min(0),
  categoryId: z.string().min(1),
  dropId: z.string().optional(),
  editionSize: z.coerce.number().int().min(1).optional(),
  active: z.coerce.boolean(),
  images: z.string().optional(),
  sizes: z.string().optional(),
  styles: z.string().optional(),
  materials: z.string().optional(),
})

function csv(value: string | undefined): string[] {
  return (value ?? "")
    .split(",")
    .map((v) => v.trim())
    .filter(Boolean)
}

function parseForm(formData: FormData) {
  const parsed = productSchema.parse({
    name: formData.get("name"),
    description: formData.get("description"),
    price: formData.get("price"),
    stock: formData.get("stock"),
    categoryId: formData.get("categoryId"),
    dropId: formData.get("dropId") || undefined,
    editionSize: formData.get("editionSize") || undefined,
    active: formData.get("active") === "on",
    images: formData.get("images") || undefined,
    sizes: formData.get("sizes") || undefined,
    styles: formData.get("styles") || undefined,
    materials: formData.get("materials") || undefined,
  })
  return {
    name: parsed.name,
    slug: slugify(parsed.name),
    description: parsed.description,
    price: parsed.price,
    stock: parsed.stock,
    categoryId: parsed.categoryId,
    dropId: parsed.dropId || null,
    editionSize: parsed.editionSize ?? null,
    active: parsed.active,
    images: csv(parsed.images),
    sizes: csv(parsed.sizes),
    styles: csv(parsed.styles),
    materials: csv(parsed.materials),
  }
}

export async function createProduct(formData: FormData) {
  const data = parseForm(formData)
  await db.product.create({ data })
  revalidatePath("/admin/products")
  redirect("/admin/products")
}

export async function updateProduct(id: string, formData: FormData) {
  const data = parseForm(formData)
  await db.product.update({ where: { id }, data })
  revalidatePath("/admin/products")
  redirect("/admin/products")
}

export async function deleteProduct(id: string) {
  await db.product.delete({ where: { id } })
  revalidatePath("/admin/products")
  redirect("/admin/products")
}
