/**
 * 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 {createContact, deleteContact, toggleFavorite, updateContact} from '@/dal/contacts'
import {protectedFormAction, protectedServerFunction} from '@/lib/serverFunctions'
import {
  createContactSchema,
  deleteContactSchema,
  toggleFavoriteSchema,
  updateContactSchema,
} from '@/schemas/contactSchemas'

/**
 * Create a new contact for the currently logged-in user.
 */
export const createContactAction = protectedFormAction({
  schema: createContactSchema,
  serverFn: async ({data, profile}) => {
    await createContact({...data, userId: profile.id})
    revalidatePath('/contacts')
  },
  functionName: 'Create contact action',
})

/**
 * Delete an existing contact.
 */
export const deleteContactServerFunction = protectedServerFunction({
  schema: deleteContactSchema,
  serverFn: async ({data, profile}) => {
    await deleteContact(data.id, profile.id)
    redirect('/contacts')
  },
  functionName: 'Delete contact action',
})

/**
 * Update an existing contact.
 **/
export const updateContactAction = protectedFormAction({
  schema: updateContactSchema,
  serverFn: async ({data, profile}) => {
    await updateContact({...data, userId: profile.id})
    redirect(`/contacts/${data.id}`)
  },
  functionName: 'Update contact action',
})

/**
 * Change a contact's favorite status from true to false or false to true.
 */
export const toggleFavoriteServerFunction = protectedServerFunction({
  schema: toggleFavoriteSchema,
  serverFn: async ({data, profile}) => {
    await toggleFavorite(data.id, profile.id)
    revalidatePath(`/contacts`)
    revalidatePath(`/contacts/${data.id}`)
  },
  functionName: 'Toggle favorite action',
})
