#include "AddRamoDialog.h"
#include <QGroupBox>
#include <QFormLayout>
#include <QHeaderView>
#include <QScrollArea>
#include <QMessageBox>
#include <QLabel>
#include <QLineEdit>
#include <QDateEdit> // Asegurarse de tenerla incluida
#include <QDebug>

// Helper para evaluar expresiones de ponderación (sin cambios)
float evaluatePonderationExpression(const QString& expression) {
    if (expression.isEmpty()) { return 0.0f; }
    bool ok;
    float value = expression.toFloat(&ok);
    if (ok) { return value; }
    if (expression.contains('/')) {
        QStringList parts = expression.split('/');
        if (parts.size() == 2) {
            float numerator = parts.at(0).trimmed().toFloat(&ok);
            if (!ok) { qWarning() << "Error de parsing: Numerador inválido en " << expression; return 0.0f; }
            float denominator = parts.at(1).trimmed().toFloat(&ok);
            if (!ok || denominator == 0.0f) { qWarning() << "Error de parsing: Denominador inválido o división por cero en " << expression; return 0.0f; }
            return numerator / denominator;
        }
    }
    qWarning() << "Error de parsing: Expresión no reconocida " << expression;
    return 0.0f;
}

AddRamoDialog::AddRamoDialog(const QList<Semestre*>& semestresDisponibles, QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("Agregar Nuevo Ramo");
    setFixedSize(500, 550); // Ajustar tamaño para menos campos de horas

    setupUi(semestresDisponibles);
}

AddRamoDialog::~AddRamoDialog() {}

void AddRamoDialog::setupUi(const QList<Semestre*>& semestresDisponibles) {
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    QScrollArea *scrollArea = new QScrollArea(this);
    scrollArea->setWidgetResizable(true);
    QWidget *scrollWidget = new QWidget(scrollArea);
    QVBoxLayout *scrollLayout = new QVBoxLayout(scrollWidget);

    // Grupo de Información General
    QGroupBox *generalInfoGroup = new QGroupBox("Información General", scrollWidget);
    QFormLayout *generalLayout = new QFormLayout(generalInfoGroup);
    nombreLineEdit = new QLineEdit(this); generalLayout->addRow("Nombre del Ramo:", nombreLineEdit);
    codigoLineEdit = new QLineEdit(this); generalLayout->addRow("Código del Ramo:", codigoLineEdit);
    creditosSpinBox = new QSpinBox(this); creditosSpinBox->setRange(1, 20); creditosSpinBox->setValue(5);
    generalLayout->addRow("Créditos:", creditosSpinBox);

    semestreComboBox = new QComboBox(this);
    for (Semestre* semestre : semestresDisponibles) { semestreComboBox->addItem(semestre->getNombre()); semestreNameToIdMap.insert(semestre->getNombre(), semestre->getIdSemestre()); }
    if (semestresDisponibles.isEmpty()) { semestreComboBox->addItem("No hay semestres disponibles"); semestreComboBox->setEnabled(false); }
    generalLayout->addRow("Semestre:", semestreComboBox);

    profesorLineEdit = new QLineEdit(this); generalLayout->addRow("Profesor:", profesorLineEdit);

    QHBoxLayout *colorLayout = new QHBoxLayout();
    seleccionarColorButton = new QPushButton("Seleccionar Color", this);
    colorPreviewLabel = new QLabel(this); colorPreviewLabel->setFixedSize(50, 20);
    colorPreviewLabel->setStyleSheet("background-color: lightgray; border: 1px solid black;");
    selectedColor = QColor(Qt::lightGray);
    colorLayout->addWidget(seleccionarColorButton); colorLayout->addWidget(colorPreviewLabel); colorLayout->addStretch();
    generalLayout->addRow("Color del Ramo:", colorLayout);
    scrollLayout->addWidget(generalInfoGroup);

/*
    // Grupo de Dedicación de Horas (SCT-Chile)
    QGroupBox *dedicacionHorasGroup = new QGroupBox("Dedicación Total de Horas (SCT-Chile)", scrollWidget);
    QFormLayout *dedicacionLayout = new QFormLayout(dedicacionHorasGroup);

    dedicacionLayout->addRow(new QLabel("--- PRESENCIAL ---"));
    totalHorasCatedraSpinBox = new QDoubleSpinBox(this); totalHorasCatedraSpinBox->setRange(0.0, 500.0); totalHorasCatedraSpinBox->setSingleStep(1.0); totalHorasCatedraSpinBox->setValue(45.0);
    dedicacionLayout->addRow("Total Horas Cátedra:", totalHorasCatedraSpinBox);

    totalHorasAyudantiaPresencialSpinBox = new QDoubleSpinBox(this); totalHorasAyudantiaPresencialSpinBox->setRange(0.0, 500.0); totalHorasAyudantiaPresencialSpinBox->setSingleStep(1.0); totalHorasAyudantiaPresencialSpinBox->setValue(0.0);
    dedicacionLayout->addRow("Total Horas Ayudantía Presencial:", totalHorasAyudantiaPresencialSpinBox);

    totalHorasEvaluacionesPresencialSpinBox = new QDoubleSpinBox(this); totalHorasEvaluacionesPresencialSpinBox->setRange(0.0, 500.0); totalHorasEvaluacionesPresencialSpinBox->setSingleStep(1.0); totalHorasEvaluacionesPresencialSpinBox->setValue(3.0);
    dedicacionLayout->addRow("Total Horas Evaluaciones Presencial:", totalHorasEvaluacionesPresencialSpinBox);

    totalHorasOtrasPresencialSpinBox = new QDoubleSpinBox(this); totalHorasOtrasPresencialSpinBox->setRange(0.0, 500.0); totalHorasOtrasPresencialSpinBox->setSingleStep(1.0); totalHorasOtrasPresencialSpinBox->setValue(3.0);
    dedicacionLayout->addRow("Total Horas Otras Presencial (Presentación):", totalHorasOtrasPresencialSpinBox);

    dedicacionLayout->addRow(new QLabel("--- NO PRESENCIAL ---"));
    totalHorasEstudioNoPresencialSpinBox = new QDoubleSpinBox(this); totalHorasEstudioNoPresencialSpinBox->setRange(0.0, 500.0); totalHorasEstudioNoPresencialSpinBox->setSingleStep(1.0); totalHorasEstudioNoPresencialSpinBox->setValue(30.0);
    dedicacionLayout->addRow("Total Horas Estudio Personal:", totalHorasEstudioNoPresencialSpinBox);

    totalHorasProyectosNoPresencialSpinBox = new QDoubleSpinBox(this); totalHorasProyectosNoPresencialSpinBox->setRange(0.0, 500.0); totalHorasProyectosNoPresencialSpinBox->setSingleStep(1.0); totalHorasProyectosNoPresencialSpinBox->setValue(24.0);
    dedicacionLayout->addRow("Total Horas Proyectos No Presencial:", totalHorasProyectosNoPresencialSpinBox);
*/
    scrollLayout->addWidget(generalInfoGroup);
// scrollLayout->addWidget(dedicacionHorasGroup);

    // Grupo de Actividades Evaluativas
    // Grupo de Actividades Evaluativas (MODIFICADO para añadir columna de estimación de horas)
    QGroupBox *actividadesEvalGroup = new QGroupBox("Actividades Evaluativas (Notas, Ponderaciones y Horas)", scrollWidget);
    QVBoxLayout *actividadesEvalLayout = new QVBoxLayout(actividadesEvalGroup);

    actividadesEvaluativasTable = new QTableWidget(this);
    actividadesEvaluativasTable->setColumnCount(4); // ¡AHORA 4 COLUMNAS! Nombre, Fecha, Ponderación, Estimación Horas
    actividadesEvaluativasTable->setHorizontalHeaderLabels({"Nombre", "Fecha", "Ponderación (%)", "Est. Horas (H)"});
    actividadesEvaluativasTable->horizontalHeader()->setStretchLastSection(true);
    actividadesEvaluativasTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    actividadesEvaluativasTable->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    actividadesEvaluativasTable->setMinimumHeight(300);
    actividadesEvalLayout->addWidget(actividadesEvaluativasTable);

    QHBoxLayout *actividadButtonsLayout = new QHBoxLayout();
    addActividadEvalButton = new QPushButton("Añadir Actividad", this);
    removeActividadEvalButton = new QPushButton("Eliminar Seleccionada", this);
    actividadButtonsLayout->addWidget(addActividadEvalButton);
    actividadButtonsLayout->addWidget(removeActividadEvalButton);
    actividadesEvalLayout->addLayout(actividadButtonsLayout);

    // Añadir algunas filas de ejemplo por defecto (MODIFICADO para incluir estimacionHorasString)
    int currentYear = QDate::currentDate().year();
    addActividadEvaluativaRow("Certamen 1", "55/2", QDate(currentYear, 10, 15), "10"); // Est. 10 horas
    addActividadEvaluativaRow("Certamen 2", "55/2", QDate(currentYear, 11, 20), "12"); // Est. 12 horas
    addActividadEvaluativaRow("Tarea 1", "25/3", QDate(currentYear, 9, 30), "20/3"); // Est. 20 horas
    addActividadEvaluativaRow("Tarea 2", "25/3", QDate(currentYear, 9, 30), "20/3"); // Est. 20 horas
    addActividadEvaluativaRow("Tarea 3", "25/3", QDate(currentYear, 9, 30), "20/3"); // Est. 20 horas
    addActividadEvaluativaRow("Proyecto Final", "20", QDate(currentYear, 12, 10), "24"); // Est. 40 horas

    scrollLayout->addWidget(actividadesEvalGroup);

    scrollArea->setWidget(scrollWidget);
    mainLayout->addWidget(scrollArea);

    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);

    connect(okButton, &QPushButton::clicked, this, &AddRamoDialog::accept);
    connect(cancelButton, &QPushButton::clicked, this, &AddRamoDialog::reject);
    connect(seleccionarColorButton, &QPushButton::clicked, this, &AddRamoDialog::on_seleccionarColorButton_clicked);
    connect(addActividadEvalButton, &QPushButton::clicked, this, &AddRamoDialog::on_addActividadEvalButton_clicked);
    connect(removeActividadEvalButton, &QPushButton::clicked, this, &AddRamoDialog::on_removeActividadEvalButton_clicked);

}

// Helper para añadir una fila de actividad evaluativa a la tabla
void AddRamoDialog::addActividadEvaluativaRow(const QString& nombre, const QString& ponderacionString, const QDate& fecha, const QString& estimacionHorasString) {
    int row = actividadesEvaluativasTable->rowCount();
    actividadesEvaluativasTable->insertRow(row);

    QLineEdit *nameEdit = new QLineEdit(nombre);
    actividadesEvaluativasTable->setCellWidget(row, 0, nameEdit); // Columna 0: Nombre

    QDateEdit *dateEdit = new QDateEdit(fecha, this);
    dateEdit->setCalendarPopup(true);
    dateEdit->setDisplayFormat("dd/MM/yyyy");
    actividadesEvaluativasTable->setCellWidget(row, 1, dateEdit); // Columna 1: Fecha

    QLineEdit *ponderationLineEdit = new QLineEdit(ponderacionString);
    actividadesEvaluativasTable->setCellWidget(row, 2, ponderationLineEdit); // Columna 2: Ponderación

    QLineEdit *estimacionLineEdit = new QLineEdit(estimacionHorasString); // <-- NUEVO: QLineEdit para estimación
    estimacionLineEdit->setPlaceholderText("Ej: 10 o 40/3");
    actividadesEvaluativasTable->setCellWidget(row, 3, estimacionLineEdit); // Columna 3: Estimación Horas
}

// Slot para añadir una nueva fila de actividad evaluativa vacía
void AddRamoDialog::on_addActividadEvalButton_clicked() {
    addActividadEvaluativaRow("", "0", QDate::currentDate(), "0"); // Añadir una fila vacía con "0" horas
}

// Slot para eliminar la fila seleccionada de actividad evaluativa
void AddRamoDialog::on_removeActividadEvalButton_clicked() {
    int currentRow = actividadesEvaluativasTable->currentRow();
    if (currentRow >= 0) {
        actividadesEvaluativasTable->removeRow(currentRow);
    } else {
        QMessageBox::warning(this, "Eliminar Actividad", "Por favor, seleccione una actividad para eliminar.");
    }
}

// Validar que la suma de ponderaciones no exceda el 100%
bool AddRamoDialog::validateActividadesEvaluativas() const {
    float totalPonderacion = 0.0f;
    for (int i = 0; i < actividadesEvaluativasTable->rowCount(); ++i) {
        QLineEdit *nameEdit = qobject_cast<QLineEdit*>(actividadesEvaluativasTable->cellWidget(i, 0));
        QDateEdit *dateEdit = qobject_cast<QDateEdit*>(actividadesEvaluativasTable->cellWidget(i, 1));
        QLineEdit *ponderationLineEdit = qobject_cast<QLineEdit*>(actividadesEvaluativasTable->cellWidget(i, 2));
        QLineEdit *estimacionLineEdit = qobject_cast<QLineEdit*>(actividadesEvaluativasTable->cellWidget(i, 3)); // Obtener el QLineEdit de estimación

        if (!nameEdit || !dateEdit || !ponderationLineEdit || !estimacionLineEdit) { // Incluir estimacionLineEdit en la comprobación
            QMessageBox::warning(const_cast<AddRamoDialog*>(this), "Error de UI", "Faltan componentes en la tabla de actividades evaluativas.");
            return false;
        }

        if (nameEdit->text().trimmed().isEmpty()) {
            QMessageBox::warning(const_cast<AddRamoDialog*>(this), "Datos Incompletos", QString("El nombre de la actividad evaluativa en la fila %1 no puede estar vacío.").arg(i + 1));
            return false;
        }

        if (!dateEdit->date().isValid()) {
            QMessageBox::warning(const_cast<AddRamoDialog*>(this), "Datos Inválidos", QString("La fecha de la actividad evaluativa '%1' en la fila %2 no es válida.").arg(nameEdit->text()).arg(i + 1));
            return false;
        }

        float ponderacionValue = evaluatePonderationExpression(ponderationLineEdit->text());
        if (ponderacionValue == 0.0f && !ponderationLineEdit->text().trimmed().isEmpty() && ponderationLineEdit->text().trimmed() != "0") {
            QMessageBox::warning(const_cast<AddRamoDialog*>(this), "Error de Ponderación",
                                 QString("La expresión de ponderación '%1' en la fila %2 no es válida.")
                                 .arg(ponderationLineEdit->text()).arg(i + 1));
            return false;
        }
        totalPonderacion += ponderacionValue;

        // ¡NUEVA VALIDACIÓN! para la estimación de horas
        float estimacionHorasValue = evaluatePonderationExpression(estimacionLineEdit->text());
        if (estimacionHorasValue < 0.0f || (estimacionHorasValue == 0.0f && !estimacionLineEdit->text().trimmed().isEmpty() && estimacionLineEdit->text().trimmed() != "0")) {
            QMessageBox::warning(const_cast<AddRamoDialog*>(this), "Error de Estimación Horas",
                                 QString("La expresión de estimación de horas '%1' en la fila %2 no es válida o resulta en cero/negativo.").arg(estimacionLineEdit->text()).arg(i + 1));
            return false;
        }
    }

    if (totalPonderacion > 100.0f + 0.001f) {
        QMessageBox::warning(const_cast<AddRamoDialog*>(this), "Error de Ponderación Total",
                             QString("La suma total de las ponderaciones de las actividades evaluativas no puede exceder el 100%%. Actualmente es %.1f%%.")
                             .arg(totalPonderacion));
        return false;
    }
    return true;
}

// Sobreescribir accept() para incluir validación (sin cambios)
void AddRamoDialog::accept() {
    if (!validateActividadesEvaluativas()) {
        return;
    }
    QDialog::accept();
}


// Getters
QString AddRamoDialog::getNombre() const { return nombreLineEdit->text(); }
QString AddRamoDialog::getCodigo() const { return codigoLineEdit->text(); }
int AddRamoDialog::getCreditos() const { return creditosSpinBox->value(); }
int AddRamoDialog::getSemestreIdSeleccionado() const {
    QString selectedSemestreName = semestreComboBox->currentText();
    return semestreNameToIdMap.value(selectedSemestreName, 0);
}
QString AddRamoDialog::getProfesor() const { return profesorLineEdit->text(); }
QColor AddRamoDialog::getColor() const { return selectedColor; }

// Getters para TOTALES DE HORAS (SCT-Chile)
float AddRamoDialog::getTotalHorasCatedra() const { return totalHorasCatedraSpinBox->value(); }
float AddRamoDialog::getTotalHorasAyudantiaPresencial() const { return totalHorasAyudantiaPresencialSpinBox->value(); }
float AddRamoDialog::getTotalHorasEvaluacionesPresencial() const { return totalHorasEvaluacionesPresencialSpinBox->value(); }
float AddRamoDialog::getTotalHorasOtrasPresencial() const { return totalHorasOtrasPresencialSpinBox->value(); }
float AddRamoDialog::getTotalHorasEstudioNoPresencial() const { return totalHorasEstudioNoPresencialSpinBox->value(); }
float AddRamoDialog::getTotalHorasProyectosNoPresencial() const { return totalHorasProyectosNoPresencialSpinBox->value(); }


QList<ActividadAcademica*> AddRamoDialog::getActividadesEvaluativasDefinidas(Ramo* ramoParent) const {
    QList<ActividadAcademica*> actividades;

    for (int i = 0; i < actividadesEvaluativasTable->rowCount(); ++i) {
        QLineEdit *nameEdit = qobject_cast<QLineEdit*>(actividadesEvaluativasTable->cellWidget(i, 0));
        QDateEdit *dateEdit = qobject_cast<QDateEdit*>(actividadesEvaluativasTable->cellWidget(i, 1));
        QLineEdit *ponderationLineEdit = qobject_cast<QLineEdit*>(actividadesEvaluativasTable->cellWidget(i, 2));
        QLineEdit *estimacionLineEdit = qobject_cast<QLineEdit*>(actividadesEvaluativasTable->cellWidget(i, 3)); // <-- Obtener el QLineEdit de estimación

        if (nameEdit && dateEdit && ponderationLineEdit && estimacionLineEdit) { // Incluir estimacionLineEdit en la comprobación
            float ponderacionValue = evaluatePonderationExpression(ponderationLineEdit->text());
            QDate fecha = dateEdit->date();
            float estimacionHorasValue = evaluatePonderationExpression(estimacionLineEdit->text()); // <-- Evaluar la estimación de horas

            // ¡CORRECCIÓN! Usar el constructor de ActividadAcademica y pasar la estimación de horas
            // Constructor: ActividadAcademica(id, nombre, descripcion, fechaInicio, fechaFin, ramoAsociado, ponderacion, notaObtenida, estimacionHoras, parent)
            ActividadAcademica* act = new ActividadAcademica(0, // id
                                                            nameEdit->text(), // nombre
                                                            "", // descripcion (vacía por ahora)
                                                            QDate(fecha), // fechaInicio (a medianoche)
                                                            QDate(fecha), // fechaFin (al final del día)
                                                            ramoParent, // ramoAsociado
                                                            ponderacionValue, // ponderacion
                                                            -1.0f, // notaObtenida (inicialmente -1.0f)
                                                            estimacionHorasValue // <-- Pasar la estimación de horas
                                                            ); // parent

            actividades.append(act);
        }
    }
    return actividades;
}

// Slot para seleccionar color (sin cambios)
void AddRamoDialog::on_seleccionarColorButton_clicked() {
    QColorDialog colorDialog(selectedColor, this);
    colorDialog.setWindowTitle("Seleccionar Color para el Ramo");
    if (colorDialog.exec() == QDialog::Accepted) {
        selectedColor = colorDialog.selectedColor();
        colorPreviewLabel->setStyleSheet(QString("background-color: %1; border: 1px solid black;")
                                          .arg(selectedColor.name()));
    }
}
