// Módulo GradeBook: registro de notas de estudiantes. Notas de 0 a 20.
// Es un tipo opaco: quien lo usa solo tiene punteros y solo llama a estas funciones.
#ifndef GRADE_BOOK_H
#define GRADE_BOOK_H

typedef struct grade_book GradeBook;

// Crea un registro vacío. Devuelve NULL si no hay memoria.
// Owner: quien llama, que debe liberarlo con grade_book_free.
GradeBook *grade_book_new(void);

// Libera el registro y todos sus nombres. Acepta NULL.
void grade_book_free(GradeBook *book);

// Agrega un estudiante al final, con una copia de name. Devuelve 1 si pudo, y 0 si el
// nombre está vacío o repetido, si la nota no es válida o si no hay memoria.
// En ese caso, no cambia nada.
int grade_book_add(GradeBook *book, const char *name, int grade);

// Cambia la nota de un estudiante. Devuelve 1 si pudo, y 0 si no está o si la nota no es válida.
int grade_book_set(GradeBook *book, const char *name, int grade);

// Devuelve la nota de un estudiante, o -1 si no está.
int grade_book_get(const GradeBook *book, const char *name);

// Borra un estudiante, sin cambiar el orden de los demás. Devuelve 1 si estaba y 0 si no.
int grade_book_remove(GradeBook *book, const char *name);

// Devuelve cuántos estudiantes hay.
int grade_book_size(const GradeBook *book);

// Devuelve el nombre en la posición index, o NULL si esa posición no existe.
// Owner: el registro. Deja de servir al borrar ese estudiante o al liberar el registro.
const char *grade_book_name_at(const GradeBook *book, int index);

#endif
