#include "Proyecto.h"


Proyecto::Proyecto(int id, const QString& nombre, const QString& descripcion,
                   const QDate& fechaInicio, const QDate& fechaFin, Ramo* ramoAsociado,
                   const QDate& fechaEntregaFinal, const QList<QString>& miembrosEquipo,
                   float ponderacion, float notaObtenida, float estimacionHoras, QObject* parent) // Ponderacion y nota van a la base
    : ActividadAcademica(id, nombre, descripcion, fechaInicio, fechaFin, ramoAsociado,
                         ponderacion, notaObtenida, estimacionHoras, parent), // Llama al constructor de la base
      m_fechaEntregaFinal(fechaEntregaFinal), m_miembrosEquipo(miembrosEquipo) {}

Proyecto::~Proyecto() {
    for (Hito* hito : m_hitos) {
        delete hito;
    }
    m_hitos.clear();
}

// Getters específicos de Proyecto
QDate Proyecto::getFechaEntregaFinal() const { return m_fechaEntregaFinal; }
QList<QString> Proyecto::getMiembrosEquipo() const { return m_miembrosEquipo; }
QList<Hito*> Proyecto::getHitos() const { return m_hitos; }

// Setters específicos de Proyecto
void Proyecto::setFechaEntregaFinal(const QDate& fecha) { m_fechaEntregaFinal = fecha; }
void Proyecto::setMiembrosEquipo(const QList<QString>& miembros) { m_miembrosEquipo = miembros; }

QString Proyecto::obtenerTipoActividad() const { return "Proyecto"; }

void Proyecto::mostrarDetalles() const {
    qDebug() << "--- Detalles de Proyecto ---";
    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() << "Completado (Total):" << (estaCompletada() ? "Sí" : "No");
    qDebug() << "Fecha de Entrega Final:" << m_fechaEntregaFinal.toString("dd/MM/yyyy");
    qDebug() << "Miembros del Equipo:" << m_miembrosEquipo.join(", ");
    if (m_ponderacion > 0) { // Si tiene ponderación, es evaluativo
        qDebug() << "  Ponderación: " << m_ponderacion << "%";
        qDebug() << "  Nota: " << (m_notaObtenida != -1.0f ? QString::number(m_notaObtenida) : "No registrada");
    }
    qDebug() << "Hitos:";
    if (m_hitos.isEmpty()) {
        qDebug() << "  (Ninguno)";
    } else {
        for (const Hito* hito : m_hitos) {
            if (hito) qDebug() << "  - " << hito->getNombreHito() << " (" << hito->getFechaHito().toString("dd/MM/yyyy") << ")"
                     << (hito->isCompletado() ? "[Completado]" : "[Pendiente]");
        }
    }
    qDebug() << "----------------------------";
}

// Métodos de gestión de Hitos (sin cambios en la lógica interna)
void Proyecto::agregarHito(Hito* hito) {
    if (hito) {
        m_hitos.append(hito);
        qDebug() << "Hito '" << hito->getNombreHito() << "' agregado al proyecto '" << m_nombre << "'.";
    }
}
void Proyecto::marcarHitoCompletado(int idHito) {
    for (Hito* hito : m_hitos) {
        if (hito->getIdHito() == idHito) {
            hito->marcarCompletado();
            return;
        }
    }
    qWarning() << "Hito con ID" << idHito << "no encontrado en el proyecto '" << m_nombre << "'.";
}
void Proyecto::eliminarHito(int idHito) {
    for (int i = 0; i < m_hitos.size(); ++i) {
        if (m_hitos.at(i)->getIdHito() == idHito) {
            delete m_hitos.at(i);
            m_hitos.removeAt(i);
            qDebug() << "Hito con ID" << idHito << "eliminado del proyecto '" << m_nombre << "'.";
            return;
        }
    }
    qWarning() << "Hito con ID" << idHito << "no encontrado para eliminar en el proyecto '" << m_nombre << "'.";
}