OnboardingController.java

package com.wavii.controller;

import com.wavii.dto.auth.AuthResponse;
import com.wavii.dto.onboarding.CompleteOnboardingRequest;
import com.wavii.dto.onboarding.VerificationStatusResponse;
import com.wavii.model.User;
import com.wavii.service.OnboardingService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/onboarding")
@RequiredArgsConstructor
@Slf4j
public class OnboardingController {

    private final OnboardingService onboardingService;

    /**
     * Finaliza el proceso de onboarding para el usuario actual.
     * 
     * @param currentUser Usuario autenticado.
     * @param request Datos del onboarding (intereses, instrumentos, nivel).
     * @return 200 OK con el estado actualizado del usuario.
     */
    @PostMapping("/complete")
    public ResponseEntity<?> completeOnboarding(
            @AuthenticationPrincipal User currentUser,
            @Valid @RequestBody CompleteOnboardingRequest request
    ) {
        try {
            User updated = onboardingService.completeOnboarding(currentUser, request);
            Map<String, Object> body = new HashMap<>();
            body.put("message", "Onboarding completado");
            body.put("onboardingCompleted", updated.isOnboardingCompleted());
            body.put("role", updated.getRole().name());
            body.put("level", updated.getLevel() != null ? updated.getLevel().name() : null);
            return ResponseEntity.ok(body);
        } catch (Exception e) {
            log.error("Error completando onboarding", e);
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(Map.of("code", "SERVER_ERROR", "message", "Error interno del servidor"));
        }
    }

    /**
     * Envía una solicitud de verificación para el rol de profesor certificado.
     * 
     * @param currentUser Usuario autenticado.
     * @return 200 OK si se envió la solicitud.
     */
    @PostMapping("/teacher/submit-verification")
    public ResponseEntity<?> submitTeacherVerification(
            @AuthenticationPrincipal User currentUser
    ) {
        try {
            onboardingService.submitTeacherVerification(currentUser);
            return ResponseEntity.ok(Map.of(
                    "message", "Solicitud de verificación enviada correctamente"
            ));
        } catch (IllegalArgumentException e) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                    .body(Map.of("code", "BAD_REQUEST", "message", e.getMessage()));
        } catch (Exception e) {
            log.error("Error en submit-verification", e);
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(Map.of("code", "SERVER_ERROR", "message", "Error interno del servidor"));
        }
    }

    /**
     * Obtiene el estado actual de la solicitud de verificación del profesor.
     * 
     * @param currentUser Usuario autenticado.
     * @return 200 OK con el estado de verificación.
     */
    @GetMapping("/teacher/verification-status")
    public ResponseEntity<?> getVerificationStatus(
            @AuthenticationPrincipal User currentUser
    ) {
        try {
            VerificationStatusResponse status = onboardingService.getTeacherVerificationStatus(currentUser);
            return ResponseEntity.ok(status);
        } catch (Exception e) {
            log.error("Error obteniendo estado de verificación", e);
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(Map.of("code", "SERVER_ERROR", "message", "Error interno del servidor"));
        }
    }
}