package dev.lions.btpxpress.service;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Service de gestion des notifications côté client.
 * <p>
 * Ce service encapsule la communication avec l'API backend pour les opérations
 * liées aux notifications.
 * </p>
 *
 * @author BTP Xpress Development Team
 * @version 1.0.0
 * @since 1.0.0
 */
@ApplicationScoped
public class NotificationService {

    private static final Logger LOG = LoggerFactory.getLogger(NotificationService.class);

    @Inject
    @RestClient
    BtpXpressApiClient apiClient;

    /**
     * Récupère le nombre de notifications non lues pour un utilisateur.
     *
     * @param userId L'identifiant de l'utilisateur (UUID en String).
     * @return Le nombre de notifications non lues, ou 0 en cas d'erreur.
     */
    public int getUnreadCount(String userId) {
        try {
            LOG.debug("Récupération du nombre de notifications non lues pour l'utilisateur : {}", userId);
            Response response = apiClient.getNotifications(userId, true);
            if (response.getStatus() == Response.Status.OK.getStatusCode()) {
                @SuppressWarnings("unchecked")
                List<Map<String, Object>> notifications = response.readEntity(List.class);
                int count = notifications != null ? notifications.size() : 0;
                LOG.debug("Nombre de notifications non lues : {}", count);
                return count;
            } else {
                LOG.warn("Erreur lors de la récupération des notifications non lues. Code HTTP : {}", 
                    response.getStatus());
                return 0;
            }
        } catch (Exception e) {
            LOG.error("Erreur lors de la communication avec l'API backend pour récupérer les notifications : {}", 
                e.getMessage(), e);
            return 0;
        }
    }

    /**
     * Récupère toutes les notifications non lues pour un utilisateur.
     *
     * @param userId L'identifiant de l'utilisateur (UUID en String).
     * @return Liste des notifications non lues, ou liste vide en cas d'erreur.
     */
    public List<Map<String, Object>> getUnreadNotifications(String userId) {
        try {
            LOG.debug("Récupération des notifications non lues pour l'utilisateur : {}", userId);
            Response response = apiClient.getNotifications(userId, true);
            if (response.getStatus() == Response.Status.OK.getStatusCode()) {
                @SuppressWarnings("unchecked")
                List<Map<String, Object>> notifications = response.readEntity(List.class);
                LOG.debug("Notifications non lues récupérées : {} élément(s)", 
                    notifications != null ? notifications.size() : 0);
                return notifications != null ? notifications : new ArrayList<>();
            } else {
                LOG.warn("Erreur lors de la récupération des notifications. Code HTTP : {}", 
                    response.getStatus());
                return new ArrayList<>();
            }
        } catch (Exception e) {
            LOG.error("Erreur lors de la communication avec l'API backend pour récupérer les notifications : {}", 
                e.getMessage(), e);
            return new ArrayList<>();
        }
    }
}

