#include "AddNotaDialog.h"

AddNotaDialog::AddNotaDialog(Calendario* calendario, QWidget *parent)
    : QDialog(parent),
      m_calendario(calendario),
      currentSelectedRamo(nullptr),
      currentSelectedActividad(nullptr)
{
    setWindowTitle("Registrar Nota de Evaluación");
    setFixedSize(400, 250);

    setupUi();
    populateRamos();
}

AddNotaDialog::~AddNotaDialog() {}

void AddNotaDialog::setupUi() {
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    QFormLayout *formLayout = new QFormLayout();

    ramoComboBox = new QComboBox(this);
    formLayout->addRow("Seleccionar Ramo:", ramoComboBox);

    actividadComboBox = new QComboBox(this);
    formLayout->addRow("Seleccionar Actividad:", actividadComboBox);

    notaSpinBox = new QDoubleSpinBox(this);
    notaSpinBox->setRange(0, 100); // Rango de notas de 1.0 a 7.0
    notaSpinBox->setSingleStep(0);
    notaSpinBox->setValue(100); // Nota inicial por defecto
    formLayout->addRow("Nota Obtenida:", notaSpinBox);

    completadaCheckBox = new QCheckBox("Marcar como Completada", this);
    completadaCheckBox->setChecked(true);
    formLayout->addRow(completadaCheckBox);

    mainLayout->addLayout(formLayout);

    QHBoxLayout *buttonLayout = new QHBoxLayout();
    okButton = new QPushButton("Aceptar", this);
    cancelButton = new QPushButton("Cancelar", this);
    buttonLayout->addStretch();
    buttonLayout->addWidget(okButton);
    buttonLayout->addWidget(cancelButton);
    mainLayout->addLayout(buttonLayout);

    // Conexiones
    connect(okButton, &QPushButton::clicked, this, &AddNotaDialog::accept);
    connect(cancelButton, &QPushButton::clicked, this, &AddNotaDialog::reject);
    connect(ramoComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
            this, &AddNotaDialog::on_ramoComboBox_currentIndexChanged);
    connect(actividadComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
            this, &AddNotaDialog::on_actividadComboBox_currentIndexChanged);
    connect(completadaCheckBox, &QCheckBox::stateChanged, this, &AddNotaDialog::on_completadaCheckBox_stateChanged);

    // Inicialmente deshabilitar la selección de actividad y la nota si no hay ramos
    actividadComboBox->setEnabled(false);
    notaSpinBox->setEnabled(false);
    completadaCheckBox->setEnabled(false);
}

void AddNotaDialog::populateRamos() {
    ramoComboBox->clear();
    m_ramoMap.clear();

    QList<Ramo*> ramos = m_calendario->getRamos();
    if (ramos.isEmpty()) {
        ramoComboBox->addItem("No hay ramos disponibles");
        ramoComboBox->setEnabled(false);
        return;
    }

    ramoComboBox->addItem("Seleccione un ramo...");
    for (Ramo* ramo : ramos) {
        ramoComboBox->addItem(ramo->getNombre());
        m_ramoMap.insert(ramo->getNombre(), ramo);
    }
    ramoComboBox->setEnabled(true);
}

void AddNotaDialog::populateActividades(Ramo* ramo) {
    actividadComboBox->clear();
    m_actividadMap.clear();

    if (!ramo) {
        actividadComboBox->addItem("Seleccione un ramo primero...");
        actividadComboBox->setEnabled(false);
        notaSpinBox->setEnabled(false);
        completadaCheckBox->setEnabled(false);
        return;
    }

    // Usar getActividadesEvaluativas() que ahora devuelve QList<ActividadAcademica*>
    QList<ActividadAcademica*> actividades = ramo->getActividadesEvaluativas();
    if (actividades.isEmpty()) {
        actividadComboBox->addItem("No hay actividades evaluativas en este ramo");
        actividadComboBox->setEnabled(false);
        notaSpinBox->setEnabled(false);
        completadaCheckBox->setEnabled(false);
        return;
    }

    actividadComboBox->addItem("Seleccione una actividad...");
    for (ActividadAcademica* actividad : actividades) { // ¡Ahora ActividadAcademica!
        if (actividad) {
            actividadComboBox->addItem(actividad->getNombre()); // Usar getNombre() de ActividadAcademica
            m_actividadMap.insert(actividad->getNombre(), actividad);
        }
    }
    actividadComboBox->setEnabled(true);
    notaSpinBox->setEnabled(false);
    completadaCheckBox->setEnabled(false);
}

void AddNotaDialog::on_ramoComboBox_currentIndexChanged(int index) {
    if (index > 0) {
        QString ramoName = ramoComboBox->currentText();
        currentSelectedRamo = m_ramoMap.value(ramoName);
        populateActividades(currentSelectedRamo);
    } else {
        currentSelectedRamo = nullptr;
        populateActividades(nullptr);
    }
    currentSelectedActividad = nullptr;
    notaSpinBox->setValue(4.0); // Nota de aprobación
    completadaCheckBox->setChecked(true);
}

void AddNotaDialog::on_actividadComboBox_currentIndexChanged(int index) {
    if (index > 0) {
        QString actividadName = actividadComboBox->currentText();
        currentSelectedActividad = m_actividadMap.value(actividadName); // Mapa ahora guarda ActividadAcademica*
        if (currentSelectedActividad) {
            notaSpinBox->setEnabled(true);
            completadaCheckBox->setEnabled(true);
            // Cargar la nota y el estado actual de la actividad si ya existen
            if (currentSelectedActividad->tieneNota()) { // Usar tieneNota()
                notaSpinBox->setValue(currentSelectedActividad->getNotaObtenida());
            } else {
                notaSpinBox->setValue(4.0); // Valor por defecto si no hay nota
            }
            completadaCheckBox->setChecked(currentSelectedActividad->estaCompletada()); // Usar estaCompletada()
        }
    } else {
        currentSelectedActividad = nullptr;
        notaSpinBox->setEnabled(false);
        completadaCheckBox->setEnabled(false);
    }
}

void AddNotaDialog::on_completadaCheckBox_stateChanged(int state) {
    if (state == Qt::Unchecked) {
        notaSpinBox->setEnabled(false);
        notaSpinBox->setValue(0); // Nota mínima o indicativo de no calificado
    } else {
        notaSpinBox->setEnabled(true);
        if (currentSelectedActividad && currentSelectedActividad->tieneNota()) { // Usar tieneNota()
            notaSpinBox->setValue(currentSelectedActividad->getNotaObtenida());
        } else {
            notaSpinBox->setValue(55);
        }
    }
}

Ramo* AddNotaDialog::getSelectedRamo() const {
    return currentSelectedRamo;
}

// Ahora devuelve ActividadAcademica*
ActividadAcademica* AddNotaDialog::getSelectedActividadEvaluativa() const {
    return currentSelectedActividad;
}

float AddNotaDialog::getNotaObtenida() const {
    return static_cast<float>(notaSpinBox->value());
}

bool AddNotaDialog::getEsCompletada() const {
    return completadaCheckBox->isChecked();
}