/**
 * 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 {revalidatePath} from 'next/cache'
import {redirect} from 'next/navigation'
import {convertFormData} from '@/lib/convertFormData'
import type {CreateContactParams, UpdateContactParams} from '@/dal/contacts'
import {createContact, deleteContact, toggleFavorite, updateContact} from '@/dal/contacts'
import {getLogger} from '@/lib/logger'
import {getSessionProfileFromCookie} from '@/lib/sessionUtils'

/**
 * 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')
  const profile = await getSessionProfileFromCookie()
  if (!profile) {
    logger.warn(`Unauthenticated user tried calling createContactAction`)
    return
  }

  // In de volgende lessen wordt validatie en autorisatie toe gevoegd.
  const contact = convertFormData<CreateContactParams>(formData)
  await createContact({...contact, userId: profile.id})

  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')

  const profile = await getSessionProfileFromCookie()
  if (!profile) {
    logger.warn(`Unauthenticated user tried calling deleteContactAction`)
    return
  }

  // In de volgende lessen wordt validatie en autorisatie toe gevoegd.
  await deleteContact(id, profile.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<UpdateContactParams>(formData)

  const profile = await getSessionProfileFromCookie()
  if (!profile) {
    logger.warn(`Unauthenticated user tried calling updateContactAction`)
    return
  }

  await updateContact({...contact, userId: profile.id})

  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.
  const profile = await getSessionProfileFromCookie()
  if (!profile) {
    logger.warn(`Unauthenticated user tried calling toggleFavoriteAction`)
    return
  }

  await toggleFavorite(id, profile.id)

  revalidatePath(`/contacts`)
  revalidatePath(`/contacts/${id}`)

  logger.info('toggleFavoriteAction completed successfully')
}
