/**
 * Het 'use server' directive wordt gebruikt om aan te geven dat de code in dit bestand enkel server functions bevat.
 * Server functions zijn asynchrone functies die enkel op de server uitgevoerd kunnen worden.
 * Een server action wordt automatisch geconverteerd naar HTTP POST endpoints door Next 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 type {Contact} from '@/models/contact'
import {revalidatePath} from 'next/cache'
import {redirect} from 'next/navigation'
import {convertFormData} from '@/lib/convertFormData'
import {createContact, deleteContact, toggleFavorite, updateContact} from '@/dal/contacts'
import {getLogger} from '@/lib/logger'

/**
 * Create a new contact for the currently logged-in user.
 */
export async function createContactAction(_prevData: unknown, formData: FormData): Promise<void> {
  const logger = await getLogger()
  logger.info('createContactAction called')

  // In de volgende lessen wordt validatie en autorisatie toe gevoegd.
  const contact = convertFormData<Omit<Contact, 'id'>>(formData)
  await createContact(contact)

  logger.info('createContactAction completed successfully')
  revalidatePath('/contacts')
}

/**
 * Delete an existing contact.
 */
export async function deleteContactServerFunction({id}: {id: string}): Promise<void> {
  const logger = await getLogger()
  logger.info('deleteContactAction called')

  // In de volgende lessen wordt validatie en autorisatie toe gevoegd.
  await deleteContact(id)

  logger.info('deleteContactAction completed successfully')
  redirect('/contacts')
}

/**
 * Update an existing contact.
 **/
export async function updateContactAction(_prevData: unknown, formData: FormData): Promise<void> {
  const logger = await getLogger()
  logger.info('updateContactAction called')

  // In de volgende lessen wordt validatie en autorisatie toe gevoegd.
  const contact = convertFormData<Contact>(formData)
  await updateContact(contact)

  logger.info('updateContactAction completed successfully')
  redirect(`/contacts/${contact.id}`)
}

export async function toggleFavoriteServerFunction({id}: {id: string}): Promise<void> {
  const logger = await getLogger()
  logger.info('toggleFavoriteAction called')

  // In de volgende lessen wordt validatie en autorisatie toe gevoegd.
  await toggleFavorite(id)
  revalidatePath(`/contacts`)
  revalidatePath(`/contacts/${id}`)

  logger.info('toggleFavoriteAction completed successfully')
}
