false, 'error' => 'No autenticado']); exit; } $method = $_SERVER['REQUEST_METHOD']; try { switch ($method) { case 'GET': // Obtener todos los alumnos $query = "SELECT * FROM alumnos ORDER BY nombre ASC"; $stmt = $pdo->prepare($query); $stmt->execute(); $alumnos = $stmt->fetchAll(PDO::FETCH_ASSOC); echo json_encode([ 'success' => true, 'data' => $alumnos, 'count' => count($alumnos) ]); break; case 'POST': $data = json_decode(file_get_contents('php://input'), true); if (empty($data['nombre']) || empty($data['email'])) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'Nombre y email son requeridos']); exit; } // Verificar email duplicado $stmt = $pdo->prepare("SELECT id FROM alumnos WHERE email = ?"); $stmt->execute([$data['email']]); if ($stmt->fetch()) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'El correo ya está registrado']); exit; } // Verificar teléfono duplicado if (!empty($data['telefono'])) { $stmt = $pdo->prepare("SELECT id FROM alumnos WHERE telefono = ?"); $stmt->execute([$data['telefono']]); if ($stmt->fetch()) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'El teléfono ya está registrado']); exit; } } $pdo->beginTransaction(); try { // Insertar alumno $stmt = $pdo->prepare(" INSERT INTO alumnos (nombre, email, telefono) VALUES (?, ?, ?) "); $stmt->execute([ $data['nombre'], $data['email'], $data['telefono'] ?? null ]); $alumnoId = $pdo->lastInsertId(); // Si viene curso_id, asignar también a curso if (!empty($data['curso_id'])) { $stmt = $pdo->prepare(" INSERT INTO alumnos_cursos (alumno_id, curso_id, estado) VALUES (?, ?, 'cursando') "); $stmt->execute([$alumnoId, $data['curso_id']]); } $pdo->commit(); echo json_encode([ 'success' => true, 'id' => $alumnoId, 'message' => 'Alumno creado y asignado exitosamente' ]); } catch (PDOException $e) { $pdo->rollBack(); http_response_code(500); echo json_encode(['success' => false, 'error' => 'Error al registrar: ' . $e->getMessage()]); } break; case 'PUT': $data = json_decode(file_get_contents('php://input'), true); if (empty($data['id']) || empty($data['nombre']) || empty($data['email'])) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'Datos incompletos']); exit; } // Verificar email duplicado (excluyendo el mismo alumno) $stmt = $pdo->prepare("SELECT id FROM alumnos WHERE email = ? AND id != ?"); $stmt->execute([$data['email'], $data['id']]); if ($stmt->fetch()) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'El correo ya está registrado por otro alumno']); exit; } // Verificar teléfono duplicado (excluyendo el mismo alumno) if (!empty($data['telefono'])) { $stmt = $pdo->prepare("SELECT id FROM alumnos WHERE telefono = ? AND id != ?"); $stmt->execute([$data['telefono'], $data['id']]); if ($stmt->fetch()) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'El teléfono ya está registrado por otro alumno']); exit; } } $stmt = $pdo->prepare(" UPDATE alumnos SET nombre = ?, email = ?, telefono = ? WHERE id = ? "); $stmt->execute([ $data['nombre'], $data['email'], $data['telefono'] ?? null, $data['id'] ]); // Si curso_id viene en la actualización, actualizar también el curso if (!empty($data['curso_id'])) { // Verifica si ya tiene una relación previa $check = $pdo->prepare("SELECT id FROM alumnos_cursos WHERE alumno_id = ?"); $check->execute([$data['id']]); if ($check->fetch()) { // Si ya tiene relación, actualizamos el curso asignado $updateCurso = $pdo->prepare(" UPDATE alumnos_cursos SET curso_id = ?, estado = 'cursando' WHERE alumno_id = ? "); $updateCurso->execute([$data['curso_id'], $data['id']]); } else { // Si no tiene relación previa, la insertamos $insertCurso = $pdo->prepare(" INSERT INTO alumnos_cursos (alumno_id, curso_id, estado) VALUES (?, ?, 'cursando') "); $insertCurso->execute([$data['id'], $data['curso_id']]); } } echo json_encode([ 'success' => true, 'message' => 'Alumno actualizado exitosamente' ]); break; case 'DELETE': $id = $_GET['id'] ?? null; if (!$id) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'ID de alumno no proporcionado']); exit; } try { $pdo->beginTransaction(); // Eliminar vinculaciones alumno_curso $stmt = $pdo->prepare("DELETE FROM alumnos_cursos WHERE alumno_id = ?"); $stmt->execute([$id]); // Eliminar alumno $stmt = $pdo->prepare("DELETE FROM alumnos WHERE id = ?"); $stmt->execute([$id]); $pdo->commit(); echo json_encode([ 'success' => true, 'message' => 'Alumno eliminado exitosamente' ]); } catch (PDOException $e) { $pdo->rollBack(); http_response_code(500); echo json_encode(['success' => false, 'error' => 'Error al eliminar alumno: ' . $e->getMessage()]); } break; default: http_response_code(405); echo json_encode(['success' => false, 'error' => 'Método no permitido']); } } catch (PDOException $e) { http_response_code(500); echo json_encode(['success' => false, 'error' => 'Error en la base de datos: ' . $e->getMessage()]); } ?>