#ifndef GESTORDATOS_H
#define GESTORDATOS_H

#include <QString>
#include <QList>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QFile>
#include <QDebug>

// Incluir todas las clases de datos que GestorDatos serializa/deserializa
#include "Usuario.h"
#include "Ramo.h"
// #include "EventoAcademico.h"    // ¡Eliminada tras unificación!
// #include "ActividadEvaluativa.h" // ¡Eliminada tras unificación!
#include "ActividadAcademica.h" // ¡Nueva clase unificada!
#include "Tarea.h"              // Necesario para dynamic_cast en jsonToActividadAcademica
#include "Proyecto.h"           // Necesario para dynamic_cast en jsonToActividadAcademica
#include "Certamen.h"           // Necesario para dynamic_cast en jsonToActividadAcademica
#include "Hito.h"               // Usado por Proyecto
#include "Semestre.h"
#include "ActividadDiaria.h"

class GestorDatos {
public:
    GestorDatos(const QString& archivoDatos = "datos_planner.json");
    ~GestorDatos();

    // Métodos para guardar todos los datos del sistema
    bool guardarDatos(const Usuario* usuario,
                      const QList<Semestre*>& semestres,
                      const QList<Ramo*>& ramos,
                      const QList<ActividadAcademica*>& eventos, // ¡Ahora ActividadAcademica!
                      const QList<ActividadDiaria*>& actividadesDiarias);

    // Métodos para cargar todos los datos del sistema
    bool cargarDatos(Usuario*& usuario,
                     QList<Semestre*>& semestres,
                     QList<Ramo*>& ramos,
                     QList<ActividadAcademica*>& eventos, // ¡Ahora ActividadAcademica!
                     QList<ActividadDiaria*>& actividadesDiarias);

private:
    QString archivoDatos; // Ruta al archivo JSON

    // --- Métodos de Serialización (ToJson) ---
    QJsonObject usuarioToJson(const Usuario* usuario) const;
    QJsonArray ramosToJson(const QList<Ramo*>& ramos) const;
    QJsonArray eventosToJson(const QList<ActividadAcademica*>& eventos) const; // ¡Ahora ActividadAcademica!
    QJsonObject actividadAcademicaToJson(const ActividadAcademica* actividad) const;
    ActividadAcademica* jsonToActividadAcademica(const QJsonObject& json, const QList<Ramo*>& ramos) const;

    QJsonArray hitosToJson(const QList<Hito*>& hitos) const;
    QJsonArray semestresToJson(const QList<Semestre*>& semestres) const;
    QJsonArray actividadesDiariasToJson(const QList<ActividadDiaria*>& actividades) const;


    // --- Métodos de Deserialización (FromJson) ---
    Usuario* jsonToUsuario(const QJsonObject& json) const;
    Ramo* jsonToRamo(const QJsonObject& json, const QList<Semestre*>& semestres) const;
    Hito* jsonToHito(const QJsonObject& json) const;
    Semestre* jsonToSemestre(const QJsonObject& json) const;
    ActividadDiaria* jsonToActividadDiaria(const QJsonObject& json, const QList<Ramo*>& ramos) const;

    // Métodos auxiliares para buscar objetos por ID
    Ramo* findRamoById(int id, const QList<Ramo*>& ramos) const;
    Semestre* findSemestreById(int id, const QList<Semestre*>& semestres) const;
};

#endif // GESTORDATOS_H
