ProfileAchievementService.java

package org.petify.backend.services;

import org.petify.backend.models.ApplicationUser;
import org.petify.backend.repository.UserRepository;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Slf4j
public class ProfileAchievementService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private AchievementService achievementService;

    @Transactional
    public void checkAndAwardProfileAchievements(String username) {
        try {
            ApplicationUser user = userRepository.findByUsername(username)
                    .orElseThrow(() -> new RuntimeException("User not found: " + username));

            checkProfilePictureAchievement(user);
            checkLocationAchievement(user);
            checkCompleteProfileAchievement(user);

        } catch (Exception e) {
            log.error("Error checking profile achievements for user {}: {}", username, e.getMessage());
        }
    }

    @Transactional
    public void checkProfilePictureAchievement(ApplicationUser user) {
        if (user.hasProfileImage()) {
            try {
                achievementService.trackProfileAchievementByName(user.getUsername(), "Pierwsza fotka");
                log.debug("Checked profile picture achievement for user: {}", user.getUsername());
            } catch (Exception e) {
                log.error("Error awarding profile picture achievement for user {}: {}", user.getUsername(), e.getMessage());
            }
        }
    }

    @Transactional
    public void checkLocationAchievement(ApplicationUser user) {
        if (user.hasLocation()) {
            try {
                achievementService.trackProfileAchievementByName(user.getUsername(), "Lokalizacja ustawiona");
                log.debug("Checked location achievement for user: {}", user.getUsername());
            } catch (Exception e) {
                log.error("Error awarding location achievement for user {}: {}", user.getUsername(), e.getMessage());
            }
        }
    }

    @Transactional
    public void checkCompleteProfileAchievement(ApplicationUser user) {
        if (isProfileComplete(user)) {
            try {
                achievementService.trackProfileAchievementByName(user.getUsername(), "Kompletny profil");
                log.debug("Checked complete profile achievement for user: {}", user.getUsername());
            } catch (Exception e) {
                log.error("Error awarding complete profile achievement for user {}: {}", user.getUsername(), e.getMessage());
            }
        }
    }

    private boolean isProfileComplete(ApplicationUser user) {
        return user.getFirstName() != null
                && !user.getFirstName().trim().isEmpty()
                && user.getLastName() != null
                && !user.getLastName().trim().isEmpty()
                && user.getEmail() != null
                && !user.getEmail().trim().isEmpty()
                && user.getPhoneNumber() != null
                && !user.getPhoneNumber().trim().isEmpty()
                && user.getBirthDate() != null
                && user.getGender() != null
                && !user.getGender().trim().isEmpty()
                && user.hasProfileImage()
                && user.hasLocation();
    }

    @Transactional
    public void onProfileUpdated(String username) {
        checkAndAwardProfileAchievements(username);
    }

    @Transactional
    public void onProfileImageAdded(String username) {
        ApplicationUser user = userRepository.findByUsername(username)
                .orElseThrow(() -> new RuntimeException("User not found: " + username));

        checkProfilePictureAchievement(user);
        checkCompleteProfileAchievement(user);
    }

    @Transactional
    public void onLocationSet(String username) {
        ApplicationUser user = userRepository.findByUsername(username)
                .orElseThrow(() -> new RuntimeException("User not found: " + username));

        checkLocationAchievement(user);
        checkCompleteProfileAchievement(user);
    }
}