/**
 * Het 'use server' directive wordt gebruikt om aan te geven dat de code in dit bestand enkel server actions bevat.
 * Server actions zijn asynchrone functies die enkel op de server uitgevoerd kunnen worden.
 * Een server action wordt automatisch geconverteerd naar HTTP endpoints door Next.js en kunnen dus aangeroepen worden
 * van op de client.
 *
 * Zodra het 'use server' directive toegevoegd wordt, mag het bestand enkel asynchrone functies exporteren.
 */
'use server'

import DAL from '@dal'
import {revalidatePath} from 'next/cache'
import {redirect} from 'next/navigation'
import {Prisma} from '@prisma/client'
import {getSessionProfileAndOptionallyRenew} from '@mediators'

/**
 * Create a new contact for the currently logged-in user.
 */
export async function createContact(contact: Prisma.ContactCreateWithoutUserInput): Promise<void> {
  const profile = await getSessionProfileAndOptionallyRenew()
  await DAL.createContact(profile.id, contact)
  revalidatePath('/contacts')
}

/**
 * Delete an existing contact.
 */
export async function deleteContact(id: string): Promise<void> {
  const profile = await getSessionProfileAndOptionallyRenew()
  await DAL.deleteContact(profile.id, id)
  redirect('/contacts')
}

/**
 * Update an existing contact.
 **/
export async function updateContact(contact: Prisma.ContactUpdateInput & {id: string}): Promise<void> {
  const profile = await getSessionProfileAndOptionallyRenew()
  await DAL.updateContact(profile.id, contact)
  redirect(`/contacts/${contact.id}`)
}
