'use server'

import DAL from '@dal'
import {redirect} from 'next/navigation'
import {Profile} from '@/lib/models/users'
import {Prisma} from '@prisma/client'
import {clearSessionCookie, getSessionId, setSessionCookie, verifyPassword} from '@serverUtils'
import {revalidatePath} from 'next/cache'
import {getSessionProfileAndOptionallyRenew} from '@mediators'

interface SignInOrRegisterParams {
  email: string
  password: string
  username?: string
}

export async function signInOrRegister(params: SignInOrRegisterParams): Promise<void> {
  let profile: Profile | null = null
  if (params.username !== undefined) {
    profile = await DAL.createUser({...params, username: params.username})
  } else {
    const user = await DAL.getUserByEmail(params.email)

    // In de volgende les wordt besproken hoe we foutmeldingen en validaties kunnen doen in een server action.
    if (!user) throw new Error('No user found')

    const isValidPassword = verifyPassword(user.password, params.password)

    if (!isValidPassword) throw new Error('No user found with the provided user/password combination.')

    profile = user
  }

  // Een sessie aanmaken in de database is niet voldoende, we moeten de sessie ook doorgeven aan de gebruiken.
  // Hiervoor gebruiken we een cookie.
  const session = await DAL.startSession(profile.id)
  await setSessionCookie(session)

  // De gebruiker is ingelogd, dus redirecten we naar de contactenpagina.
  redirect('/contacts')
}

export async function signOut(): Promise<void> {
  const sessionId = await getSessionId()
  if (sessionId) {
    await DAL.stopSession(sessionId)
    await clearSessionCookie()
  }
}

export async function updateProfile(profile: Prisma.UserUpdateInput): Promise<void> {
  const sessionProfile = await getSessionProfileAndOptionallyRenew()
  await DAL.updateUser(sessionProfile.id, profile)
  revalidatePath('/', 'layout')
}
