#include "ActividadAcademica.h"
#include "Ramo.h" // Incluir Ramo.h

int ActividadAcademica::s_nextId = 0;


ActividadAcademica::ActividadAcademica(int id, const QString& nombre, const QString& descripcion,
                                   const QDate& fechaInicio, const QDate& fechaFin, Ramo* ramoAsociado,
                                   float ponderacion, float notaObtenida,
                                   float estimacionHoras, // <-- Nuevo parámetro
                                   QObject* parent)
    : QObject(parent),
      m_id(id), m_nombre(nombre), m_descripcion(descripcion),
      m_fechaInicio(fechaInicio), m_fechaFin(fechaFin), m_ramoAsociado(ramoAsociado),
      m_ponderacion(ponderacion), m_notaObtenida(notaObtenida), m_completadoManual(false),
      m_estimacionHoras(estimacionHoras) // <-- Inicializar nuevo atributo
{
    if (id == 0) {
        m_id = ++s_nextId;
    } else if (id > s_nextId) {
        s_nextId = id;
    }
}


// Destructor
ActividadAcademica::~ActividadAcademica() {
    // No hay punteros directos a objetos hijos que liberar aquí, QObject gestiona sus hijos.
    // m_ramoAsociado es una referencia, su memoria la gestiona Calendario.
}

// Getters
int ActividadAcademica::getId() const { return m_id; }
QString ActividadAcademica::getNombre() const { return m_nombre; }
QString ActividadAcademica::getDescripcion() const { return m_descripcion; }
QDate ActividadAcademica::getFechaInicio() const { return m_fechaInicio; }
QDate ActividadAcademica::getFechaFin() const { return m_fechaFin; }
Ramo* ActividadAcademica::getRamoAsociado() const { return m_ramoAsociado; }

// Getters de evaluación
float ActividadAcademica::getPonderacion() const { return m_ponderacion; }
float ActividadAcademica::getNotaObtenida() const { return m_notaObtenida; }

bool ActividadAcademica::tieneNota() const {
    return m_notaObtenida != -1.0f;
}

// Lógica de completado: si tiene nota o si se marcó manualmente como completada
bool ActividadAcademica::estaCompletada() const {
    return tieneNota() || m_completadoManual;
}

float ActividadAcademica::getEstimacionHoras() const { return m_estimacionHoras; } 


// Setters
void ActividadAcademica::setNombre(const QString& nombre) { m_nombre = nombre; }
void ActividadAcademica::setDescripcion(const QString& descripcion) { m_descripcion = descripcion; }
void ActividadAcademica::setFechaInicio(const QDate& fechaInicio) { m_fechaInicio = fechaInicio; }
void ActividadAcademica::setFechaFin(const QDate& fechaFin) { m_fechaFin = fechaFin; }
void ActividadAcademica::setRamoAsociado(Ramo* ramo) { m_ramoAsociado = ramo; }

// Setters de evaluación
void ActividadAcademica::setPonderacion(float ponderacion) { m_ponderacion = ponderacion; }
void ActividadAcademica::setNotaObtenida(float nota) {
    m_notaObtenida = nota;
   /* if (nota != -1.0f) { // Si se asigna una nota válida, se considera completada
        m_completadoManual = true; // También marcar como completada manualmente
    }*/
}
void ActividadAcademica::setCompletadaManual(bool completado) {
    m_completadoManual = completado;
    // Si se marca como no completada, la nota podría resetearse.
    if (!completado) {
        m_notaObtenida = -1.0f;
    }
}

void ActividadAcademica::setEstimacionHoras(float horas) { m_estimacionHoras = horas; }

// Opcional: Métodos estáticos para nextId (descomentar y usar si se añaden)

void ActividadAcademica::resetNextId() { s_nextId = 0; }
//void ActividadAcademica::setNextId(int id) { if (id > s_nextId) s_nextId = id; }


// ¡CAMBIO CLAVE! Implementación por defecto de los métodos virtuales
QString ActividadAcademica::obtenerTipoActividad() const {
    return "Tarea"; // O "ActividadAcademica" o similar
}

void ActividadAcademica::mostrarDetalles() const {
    qDebug() << "--- Detalles de Actividad Genérica ---";
    qDebug() << "ID:" << m_id;
    qDebug() << "Nombre:" << m_nombre;
    qDebug() << "Descripción:" << m_descripcion;
    qDebug() << "Inicio:" << m_fechaInicio.toString("dd/MM/yyyy hh:mm");
    qDebug() << "Fin:" << m_fechaFin.toString("dd/MM/yyyy hh:mm");
    qDebug() << "Ramo Asociado:" << (m_ramoAsociado ? m_ramoAsociado->getNombre() : "N/A");
    qDebug() << "Completada:" << (estaCompletada() ? "Sí" : "No");
    if (m_ponderacion > 0) {
        qDebug() << "  Ponderación: " << m_ponderacion << "%";
        qDebug() << "  Nota: " << (m_notaObtenida != -1.0f ? QString::number(m_notaObtenida) : "No registrada");
    }
    qDebug() << "-----------------------------------";
}
