'use server'

import { randomBytes } from 'node:crypto'
import { redirect } from 'next/navigation'
import { revalidatePath } from 'next/cache'
import { prisma } from '@/lib/prisma'
import { getCurrentUser } from '@/lib/current-user'
import { buildListingInput, type WizardForm } from '@/lib/publish'

export type PublishResult = { ok: false; errors: string[] }

export async function createListingAction(form: WizardForm): Promise<PublishResult> {
  const user = await getCurrentUser()
  if (!user) redirect('/login?next=/dashboard/publicar-activo')

  const built = buildListingInput(form)
  if (!built.ok) return { ok: false, errors: built.errors }

  // Garantizar slug único
  let slug = built.data.slug || 'activo'
  if (await prisma.listing.findUnique({ where: { slug } })) {
    slug = `${slug}-${randomBytes(3).toString('hex')}`
  }

  await prisma.listing.create({
    data: { ...built.data, slug, ownerId: user.id },
  })
  redirect(`/marketplace/${slug}`)
}

export async function updateListingAction(listingId: string, form: WizardForm): Promise<PublishResult> {
  const user = await getCurrentUser()
  if (!user) redirect('/login?next=/dashboard')

  const existing = await prisma.listing.findUnique({ where: { id: listingId } })
  if (!existing || existing.ownerId !== user.id) {
    return { ok: false, errors: ['No tienes permiso para editar esta publicación.'] }
  }

  const built = buildListingInput(form)
  if (!built.ok) return { ok: false, errors: built.errors }

  // Mantener el slug original (no romper enlaces); reemplazar relaciones.
  const { slug: _slug, commodities, dealTypes, imageSeed: _img, ...scalar } = built.data
  void _slug
  void _img

  await prisma.listing.update({
    where: { id: listingId },
    data: {
      ...scalar,
      commodities: { deleteMany: {}, create: commodities.create },
      dealTypes: { deleteMany: {}, create: dealTypes.create },
    },
  })

  revalidatePath(`/marketplace/${existing.slug}`)
  revalidatePath('/dashboard')
  redirect(`/marketplace/${existing.slug}`)
}

export async function deleteListingAction(formData: FormData): Promise<void> {
  const user = await getCurrentUser()
  if (!user) redirect('/login?next=/dashboard')

  const listingId = String(formData.get('listingId') ?? '')
  const existing = await prisma.listing.findUnique({ where: { id: listingId } })
  if (existing && existing.ownerId === user.id) {
    await prisma.listing.delete({ where: { id: listingId } })
  }
  revalidatePath('/dashboard')
  redirect('/dashboard')
}
