package dev.lions.unionflow.server.service;

import dev.lions.unionflow.server.api.dto.favoris.request.CreateFavoriRequest;
import dev.lions.unionflow.server.api.dto.favoris.response.FavoriResponse;
import dev.lions.unionflow.server.entity.Favori;
import dev.lions.unionflow.server.repository.FavoriRepository;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import org.jboss.logging.Logger;

import jakarta.ws.rs.NotFoundException;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;

/**
 * Service métier pour la gestion des favoris
 * 
 * @author UnionFlow Team
 * @version 1.0
 */
@ApplicationScoped
public class FavorisService {

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

    @Inject
    FavoriRepository favoriRepository;

    public List<FavoriResponse> listerFavoris(UUID utilisateurId) {
        LOG.infof("Récupération des favoris pour l'utilisateur %s", utilisateurId);
        List<Favori> favoris = favoriRepository.findByUtilisateurId(utilisateurId);
        return favoris.stream()
                .map(this::toDTO)
                .collect(Collectors.toList());
    }

    @Transactional
    public FavoriResponse creerFavori(CreateFavoriRequest request) {
        LOG.infof("Création d'un favori pour l'utilisateur %s", request.utilisateurId());

        Favori favori = toEntity(request);
        favori.setNbVisites(0);
        favori.setEstPlusUtilise(false);

        favoriRepository.persist(favori);
        LOG.infof("Favori créé avec succès: %s", favori.getTitre());

        return toDTO(favori);
    }

    @Transactional
    public void supprimerFavori(UUID id) {
        LOG.infof("Suppression du favori %s", id);
        boolean deleted = favoriRepository.deleteById(id);
        if (!deleted) {
            throw new NotFoundException("Favori non trouvé avec l'ID: " + id);
        }
        LOG.infof("Favori supprimé avec succès: %s", id);
    }

    public Map<String, Object> obtenirStatistiques(UUID utilisateurId) {
        LOG.infof("Récupération des statistiques des favoris pour l'utilisateur %s", utilisateurId);
        Map<String, Object> stats = new HashMap<>();
        List<Favori> favoris = favoriRepository.findByUtilisateurId(utilisateurId);
        stats.put("totalFavoris", favoris.size());
        stats.put("totalPages", favoriRepository.countByUtilisateurIdAndType(utilisateurId, "PAGE"));
        stats.put("totalDocuments", favoriRepository.countByUtilisateurIdAndType(utilisateurId, "DOCUMENT"));
        stats.put("totalContacts", favoriRepository.countByUtilisateurIdAndType(utilisateurId, "CONTACT"));
        return stats;
    }

    // Mappers Entity <-> DTO (DRY/WOU)
    private FavoriResponse toDTO(Favori favori) {
        if (favori == null)
            return null;
        FavoriResponse response = new FavoriResponse();
        response.setId(favori.getId());
        response.setUtilisateurId(favori.getUtilisateurId());
        response.setTypeFavori(favori.getTypeFavori());
        response.setTitre(favori.getTitre());
        response.setDescription(favori.getDescription());
        response.setUrl(favori.getUrl());
        response.setIcon(favori.getIcon());
        response.setCouleur(favori.getCouleur());
        response.setCategorie(favori.getCategorie());
        response.setOrdre(favori.getOrdre());
        response.setNbVisites(favori.getNbVisites());
        response.setDerniereVisite(favori.getDerniereVisite() != null ? favori.getDerniereVisite().toString() : null);
        response.setEstPlusUtilise(favori.getEstPlusUtilise());
        return response;
    }

    private Favori toEntity(CreateFavoriRequest dto) {
        if (dto == null)
            return null;
        Favori favori = new Favori();
        favori.setUtilisateurId(dto.utilisateurId());
        favori.setTypeFavori(dto.typeFavori());
        favori.setTitre(dto.titre());
        favori.setDescription(dto.description());
        favori.setUrl(dto.url());
        favori.setIcon(dto.icon());
        favori.setCouleur(dto.couleur());
        favori.setCategorie(dto.categorie());
        favori.setOrdre(dto.ordre());
        favori.setNbVisites(dto.nbVisites());
        if (dto.derniereVisite() != null) {
            try {
                favori.setDerniereVisite(LocalDateTime.parse(dto.derniereVisite()));
            } catch (Exception e) {
                LOG.warnf("Erreur lors du parsing de la date de dernière visite: %s", dto.derniereVisite());
            }
        }
        favori.setEstPlusUtilise(dto.estPlusUtilise());
        return favori;
    }
}
