"use server"

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

const dropSchema = z.object({
  name: z.string().min(1),
  description: z.string().optional(),
  releaseDate: z.string().min(1),
  status: z.enum(["UPCOMING", "LIVE", "SOLD_OUT"]),
  coverImage: z.string().optional(),
  workshopVideoUrl: z.string().optional(),
  stylistId: z.string().optional(),
  artistId: z.string().optional(),
  aiAgentId: z.string().optional(),
  electricianId: z.string().optional(),
  isDraft: z.coerce.boolean(),
})

function parseForm(formData: FormData) {
  const parsed = dropSchema.parse({
    name: formData.get("name"),
    description: formData.get("description") || undefined,
    releaseDate: formData.get("releaseDate"),
    status: formData.get("status"),
    coverImage: formData.get("coverImage") || undefined,
    workshopVideoUrl: formData.get("workshopVideoUrl") || undefined,
    stylistId: formData.get("stylistId") || undefined,
    artistId: formData.get("artistId") || undefined,
    aiAgentId: formData.get("aiAgentId") || undefined,
    electricianId: formData.get("electricianId") || undefined,
    isDraft: formData.get("isDraft") === "on",
  })
  return {
    name: parsed.name,
    slug: slugify(parsed.name),
    description: parsed.description || null,
    releaseDate: new Date(parsed.releaseDate),
    status: parsed.status,
    coverImage: parsed.coverImage || null,
    workshopVideoUrl: parsed.workshopVideoUrl || null,
    stylistId: parsed.stylistId || null,
    artistId: parsed.artistId || null,
    aiAgentId: parsed.aiAgentId || null,
    electricianId: parsed.electricianId || null,
    isDraft: parsed.isDraft,
  }
}

// À chaque nouveau thème de drop, PROTO génère automatiquement le brief de
// concept de départ (silhouette, matières, pièces clés, direction).
export async function createDrop(formData: FormData) {
  const data = parseForm(formData)
  const concept = await generateDropConcept({ name: data.name, description: data.description })
  await db.drop.create({
    data: { ...data, aiConcept: concept.text, aiConceptSource: concept.source },
  })
  revalidatePath("/admin/drops")
  redirect("/admin/drops")
}

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

// Regénère le brief PROTO à la demande, sans modifier le reste du drop
// (utile si le thème a changé, ou pour repartir d'un nouveau tirage).
export async function regenerateDropConcept(id: string) {
  const drop = await db.drop.findUniqueOrThrow({ where: { id } })
  const concept = await generateDropConcept({ name: drop.name, description: drop.description })
  await db.drop.update({
    where: { id },
    data: { aiConcept: concept.text, aiConceptSource: concept.source },
  })
  revalidatePath("/admin/drops")
  revalidatePath(`/admin/drops/${id}`)
  revalidatePath("/drops")
}

export async function deleteDrop(id: string) {
  await db.drop.delete({ where: { id } })
  revalidatePath("/admin/drops")
  redirect("/admin/drops")
}
