#ifndef ACTIVIDADACADEMICA_H
#define ACTIVIDADACADEMICA_H

#include <QString>
#include <QDate>
#include <QDate> // Para QDate, si la fecha de la actividad evaluativa es diferente a fechaFin
#include <QDebug>
#include <QObject>

// Forward declaration
class Ramo;

class ActividadAcademica : public QObject {
    Q_OBJECT // Macro necesaria para el sistema de metadatos de Qt

public:
    // Constructor modificado: ¡Añadir float estimacionHoras!
    ActividadAcademica(int id, const QString& nombre, const QString& descripcion,
                       const QDate& fechaInicio, const QDate& fechaFin, Ramo* ramoAsociado,
                       float ponderacion = 0.0f, float notaObtenida = -1.0f,
                       float estimacionHoras = 0.0f, // <-- Nuevo parámetro
                       QObject* parent = nullptr);

    // Destructor virtual (necesario si hay herencia)
    virtual ~ActividadAcademica();

    // Getters
    int getId() const;
    QString getNombre() const;
    QString getDescripcion() const;
    QDate getFechaInicio() const;
    QDate getFechaFin() const;
    Ramo* getRamoAsociado() const;

    // Getters de evaluación
    float getPonderacion() const; // Ponderación de esta actividad dentro del ramo
    float getNotaObtenida() const;
    bool tieneNota() const; // Comprueba si ya tiene una nota válida
    bool estaCompletada() const; // Verdadero si tiene nota, o si es un evento no evaluativo y marcado como completado.
    float getEstimacionHoras() const; // <-- Nuevo Getter para estimacionHoras
    
    // Setters
    void setNombre(const QString& nombre);
    void setDescripcion(const QString& descripcion);
    void setFechaInicio(const QDate& fechaInicio);
    void setFechaFin(const QDate& fechaFin);
    void setRamoAsociado(Ramo* ramo);

    static void resetNextId();

    // Setters de evaluación
    void setPonderacion(float ponderacion);
    void setNotaObtenida(float nota);
    void setCompletadaManual(bool completado); // Para eventos no evaluativos o para anular la nota
    void setEstimacionHoras(float horas);

    // Métodos virtuales puros (deben ser implementados por las clases derivadas)
    virtual QString obtenerTipoActividad() const; // "Tarea", "Proyecto", "Certamen"
    virtual void mostrarDetalles() const;

protected:
    int m_id;
    QString m_nombre;
    QString m_descripcion;
    QDate m_fechaInicio;
    QDate m_fechaFin;
    Ramo* m_ramoAsociado; // Puntero al ramo

    // Atributos de evaluación
    float m_ponderacion; // Ponderación de esta actividad individual
    float m_notaObtenida; // -1.0f si no tiene nota (o no se ha realizado)
    bool m_completadoManual; // Para actividades no evaluativas o para forzar completado
    float m_estimacionHoras; // 

    static int s_nextId;
};

#endif // ACTIVIDADACADEMICA_H
