package com.escolapios.fctmongo.controller;

import com.escolapios.fctmongo.entity.Profesor;
import com.escolapios.fctmongo.repository.ProfesorRepository;
import com.escolapios.fctmongo.service.ProfesorService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@CrossOrigin(origins = "*") 
@RestController
@RequestMapping("/api/profesores")
public class ProfesorController {
    private final ProfesorService profesorService;
    private final ProfesorRepository profesorRepository;

    public ProfesorController(ProfesorService profesorService,
                            ProfesorRepository profesorRepository
    ) { 
        this.profesorService = profesorService;
        this.profesorRepository = profesorRepository;

    }

    @GetMapping
    public ResponseEntity<List<Profesor>> listar() { 
        return ResponseEntity.ok(profesorService.obtenerTodos()); }

    /**
     * 🔍 GET -> http://localhost:8080/api/profesores/{id}
     * Recupera un profesor individual de MongoDB por su ID único
     */
    @GetMapping("/{id}")
    public ResponseEntity<Profesor> obtenerPorId(@PathVariable String id) {
        // Busca en tu repositorio nativo NoSQL
        return profesorRepository.findById(id)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
    }

    @PostMapping
    public ResponseEntity<Profesor> crear(@RequestBody Profesor profesor) { 
        return new ResponseEntity<>(profesorService.guardar(profesor), HttpStatus.CREATED); 
    }
    /**
     * 🔄 PUT -> http://localhost:8080/api/profesores/{id}
     * Actualiza un profesor existente sobrescribiendo o editando sus datos en MongoDB
     */
    @PutMapping("/{id}")
    public ResponseEntity<Profesor> actualizar(@PathVariable String id, @RequestBody Profesor profesor) {
        System.out.println("🔄 [MONGO] Petición de actualización para Profesor ID: " + id);
        
        // 1. Forzamos el ID de la URL al objeto para asegurar que modifique el documento correcto
        profesor.setId(id);
        
        // 2. Ejecutamos el guardado utilizando tu servicio estructurado
        Profesor profesorActualizado = profesorService.guardar(profesor);
        
        return ResponseEntity.ok(profesorActualizado);
    }

    /**
     * 🗑️ DELETE -> http://localhost:8080/api/profesores/{id}
     * Elimina físicamente un profesor de su colección en MongoDB por su ID String
     */
    @DeleteMapping("/{id}")
    public ResponseEntity<String> eliminar(@PathVariable String id) {
        System.out.println("🗑️ [MONGO] Petición de borrado físico para Profesor ID: " + id);
        try {
            // 1. Verificación preventiva de existencia en la base de datos
            boolean existe = profesorRepository.existsById(id);
            if (!existe) {
                return ResponseEntity.status(HttpStatus.NOT_FOUND)
                        .body("El profesor con ID " + id + " no existe en el sistema.");
            }

            // 2. Eliminamos el registro de la colección independiente de profesores
            profesorRepository.deleteById(id);
            System.out.println("✅ [MONGO] Profesor " + id + " borrado con éxito.");
            
            // Retornamos una respuesta de confirmación de texto plano que leerá el fetch en tu JS
            return ResponseEntity.ok("Profesor eliminado correctamente.");

        } catch (Exception e) {
            System.err.println("❌ Fallo crítico borrando profesor: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("Error interno en el servidor al intentar eliminar al profesor: " + e.getMessage());
        }
    }


}
