<?php

use adrienpayet\notifications\Notification;

/**
 * Send a notification to all users who manage a specific project, excluding the user sending the notification.
 *
 * This function retrieves all users managing the project specified by `$projectUri` (excluding the current user)
 * and adds a new notification to their `notifications` field, stored as a YAML-encoded array.
 * If the `notifications` field is empty, an empty array is initialized before appending the new notification.
 * In case of an error during update, an exception is thrown with the error message and line number.
 *
 * @param array $notificationData An associative array containing the notification data to be added.
 * @param string $projectUri The URI of the project associated with this notification.
 * @throws Exception If an error occurs while updating a user's notifications.
 */

 return function ($project, $notificationData) {
    $recipients = $project->managers()->without($this);

    if ($recipients->isEmpty()) return;        

    $newNotification = new Notification($notificationData);

    foreach ($recipients as $otherUser) {
        try {
            $notifications = $otherUser->notifications()->isNotEmpty()
                ? Yaml::decode($otherUser->notifications()->value())
                : [];
            
            $notifications[] = $newNotification->toArray();

            $otherUser->update([
                'notifications' => $notifications
            ]);
        } catch (\Throwable $th) {
            error_log("Notification error for user " . $otherUser->email() . ": " . $th->getMessage());
            throw new Exception("Error updating notifications: " . $th->getMessage() . ' line ' . $th->getLine(), 1);
        }
    }
};
