OnboardingService.java

package com.wavii.service;

import com.wavii.dto.onboarding.CompleteOnboardingRequest;
import com.wavii.dto.onboarding.VerificationStatusResponse;
import com.wavii.model.User;
import com.wavii.model.enums.Role;
import com.wavii.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Slf4j
public class OnboardingService {

    private final UserRepository userRepository;

    /**
     * Completa el proceso de onboarding del usuario, actualizando su rol, nivel y avatar.
     * 
     * @param currentUser Usuario actual.
     * @param request Datos del onboarding completado.
     * @return El usuario actualizado.
     */
    @Transactional
    public User completeOnboarding(User currentUser, CompleteOnboardingRequest request) {
        currentUser.setRole(request.getRole());
        currentUser.setLevel(request.getLevel());
        currentUser.setOnboardingCompleted(true);

        if (request.getAvatarUrl() != null && !request.getAvatarUrl().isBlank()) {
            currentUser.setAvatarUrl(request.getAvatarUrl());
        }

        User saved = userRepository.save(currentUser);
        log.debug("Onboarding completado para: {}", saved.getEmail());
        return saved;
    }

    /**
     * Registra una solicitud de verificación para un profesor.
     * 
     * @param currentUser Usuario profesor solicitante.
     */
    @Transactional
    public void submitTeacherVerification(User currentUser) {
        if (currentUser.getRole() != Role.PROFESOR_PARTICULAR
                && currentUser.getRole() != Role.PROFESOR_CERTIFICADO) {
            throw new IllegalArgumentException("Solo los profesores pueden solicitar verificación");
        }
        log.info("[TEACHER VERIFICATION] Solicitud de verificación recibida de: {} ({})",
                currentUser.getEmail(), currentUser.getRole());
    }

    /**
     * Obtiene el estado actual de la verificación de profesor para el usuario.
     * 
     * @param currentUser Usuario actual.
     * @return Respuesta con el estado y mensaje explicativo.
     */
    public VerificationStatusResponse getTeacherVerificationStatus(User currentUser) {
        String message;
        if (currentUser.isTeacherVerified()) {
            message = "Tu cuenta de profesor está verificada";
        } else if (currentUser.getRole() == Role.PROFESOR_PARTICULAR
                || currentUser.getRole() == Role.PROFESOR_CERTIFICADO) {
            message = "Tu solicitud de verificación está pendiente de revisión";
        } else {
            message = "No tienes una solicitud de verificación activa";
        }

        return VerificationStatusResponse.builder()
                .teacherVerified(currentUser.isTeacherVerified())
                .onboardingCompleted(currentUser.isOnboardingCompleted())
                .message(message)
                .build();
    }
}