ParticipationService.java

package com.archiweb.service;

import com.archiweb.model.Code;
import com.archiweb.model.Participation;
import com.archiweb.model.User;
import com.archiweb.repository.CodeRepository;
import com.archiweb.repository.ParticipationRepository;
import com.archiweb.repository.UserRepository;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@Service
public class ParticipationService {

    private final ParticipationRepository participationRepository;
    private final UserRepository userRepository;
    private final CodeRepository codeRepository;

    public ParticipationService(ParticipationRepository participationRepository,
                                UserRepository userRepository,
                                CodeRepository codeRepository) {
        this.participationRepository = participationRepository;
        this.userRepository = userRepository;
        this.codeRepository = codeRepository;
    }

    public Participation participate(Long userId, String codeValeur) {
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new RuntimeException("Utilisateur non trouvé"));

        Code code = codeRepository.findByValeur(codeValeur)
                .orElseThrow(() -> new RuntimeException("Code non trouvé"));

        if (code.isUsed())
            throw new RuntimeException("Ce code a déjà été utilisé");

        if (participationRepository.findByUserAndCode(user, code).isPresent())
            throw new RuntimeException("Ce code a déjà été utilisé par cet utilisateur");

        code.setUsed(true);
        code.setUsedAt(LocalDateTime.now());
        codeRepository.save(code);

        Participation participation = new Participation();
        participation.setUser(user);
        participation.setCode(code);
        participation.setClaimed(true);
        participation.setClaimedAt(LocalDateTime.now());
        participation.setClaimChannel("WEB");
        participation.setClaimedBy(user.getEmail());

        return participationRepository.save(participation);
    }

    public Map<String, Long> getParticipationStats() {
        long gagnantes = participationRepository.countByCode_Gagnant(true);
        long perdantes = participationRepository.countByCode_Gagnant(false);
        long total = participationRepository.count();

        return Map.of("total", total, "gagnantes", gagnantes, "perdantes", perdantes);
    }
}