#include "AddTareaDialog.h"


float AddTareaDialog::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 de ponderación no reconocida " << expression;
    return 0.0f;
}


AddTareaDialog::AddTareaDialog(const QList<Ramo*>& ramosDisponibles, QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("Agregar Nueva Tarea");
    setFixedSize(450, 650); // Ajustar el tamaño del diálogo

    setupUi(ramosDisponibles); // Configura la UI pasando los ramos
}

AddTareaDialog::~AddTareaDialog() {}



void AddTareaDialog::setupUi(const QList<Ramo*>& ramosDisponibles) {
    QVBoxLayout *mainLayout = new QVBoxLayout(this);

    // Campos de entrada
    QHBoxLayout *nombreLayout = new QHBoxLayout();
    nombreLayout->addWidget(new QLabel("Nombre de la Tarea:"));
    nombreLineEdit = new QLineEdit(this);
    nombreLayout->addWidget(nombreLineEdit);
    mainLayout->addLayout(nombreLayout);

    mainLayout->addWidget(new QLabel("Descripción:"));
    descripcionTextEdit = new QTextEdit(this);
    descripcionTextEdit->setPlaceholderText("Detalles de la tarea...");
    mainLayout->addWidget(descripcionTextEdit);

    QHBoxLayout *fechaInicioLayout = new QHBoxLayout();
    fechaInicioLayout->addWidget(new QLabel("Fecha y Hora de Inicio:"));
    fechaInicioDateTimeEdit = new QDateEdit(QDate::currentDate(), this);
    fechaInicioDateTimeEdit->setCalendarPopup(true);
    fechaInicioDateTimeEdit->setDisplayFormat("dd/MM/yyyy hh:mm");
    fechaInicioLayout->addWidget(fechaInicioDateTimeEdit);
    mainLayout->addLayout(fechaInicioLayout);

    QHBoxLayout *fechaFinLayout = new QHBoxLayout();
    fechaFinLayout->addWidget(new QLabel("Fecha y Hora de Término (Plazo):"));
    fechaFinDateTimeEdit = new QDateEdit(QDate::currentDate().addDays(7), this); // Por defecto 7 días después
    fechaFinDateTimeEdit->setCalendarPopup(true);
    fechaFinDateTimeEdit->setDisplayFormat("dd/MM/yyyy hh:mm");
    fechaFinLayout->addWidget(fechaFinDateTimeEdit);
    mainLayout->addLayout(fechaFinLayout);

    // Conexión para actualizar fecha y hora de entrega al cambiar fechaFin

    QHBoxLayout *ramoLayout = new QHBoxLayout();
    ramoLayout->addWidget(new QLabel("Ramo Asociado:"));
    ramoComboBox = new QComboBox(this);
    for (Ramo* ramo : ramosDisponibles) {
        ramoComboBox->addItem(ramo->getNombre());
        ramoNameToIdMap.insert(ramo->getNombre(), ramo->getIdRamo());
    }
    ramoLayout->addWidget(ramoComboBox);
    mainLayout->addLayout(ramoLayout);

    // Muestra la fecha y hora de entrega (se actualiza automáticamente desde fechaFin)
    QHBoxLayout *entregaLayout = new QHBoxLayout();
    entregaLayout->addWidget(new QLabel("Fecha de Entrega:"));
    fechaEntregaLineEdit = new QLineEdit(this);
    fechaEntregaLineEdit->setReadOnly(true);
    entregaLayout->addWidget(fechaEntregaLineEdit);

    mainLayout->addLayout(entregaLayout);

    // Llamar al slot una vez para inicializar los campos de fecha/hora de entrega

    QHBoxLayout *estimacionLayout = new QHBoxLayout();
    estimacionLayout->addWidget(new QLabel("Horas Estimadas:"));
    estimacionHorasSpinBox = new QSpinBox(this); // <-- ¡Esta línea es crucial!
    estimacionHorasSpinBox->setRange(1, 100);
    estimacionHorasSpinBox->setValue(5);
    estimacionLayout->addWidget(estimacionHorasSpinBox);
    mainLayout->addLayout(estimacionLayout);


    QGroupBox *evaluacionGroup = new QGroupBox("Detalles de Evaluación", this);
    QVBoxLayout *evaluacionLayout = new QVBoxLayout(evaluacionGroup);

    esEvaluativaCheckBox = new QCheckBox("¿Es una actividad evaluativa?", this);
    evaluacionLayout->addWidget(esEvaluativaCheckBox);

    QHBoxLayout *nombreEvalLayout = new QHBoxLayout();
    nombreEvalLayout->addWidget(new QLabel("Nombre Eval.:"));
    nombreActividadEvaluativaLineEdit = new QLineEdit(this);
    nombreEvalLayout->addWidget(nombreActividadEvaluativaLineEdit);
    evaluacionLayout->addLayout(nombreEvalLayout);

    QHBoxLayout *ponderacionEvalLayout = new QHBoxLayout();
    ponderacionEvalLayout->addWidget(new QLabel("Ponderación (%):"));
    // ¡CAMBIO AQUÍ! De QDoubleSpinBox a QLineEdit
    ponderacionActividadEvaluativaLineEdit = new QLineEdit(this); // <-- Ahora un QLineEdit
    ponderacionActividadEvaluativaLineEdit->setPlaceholderText("Ej: 25 o 100/3"); // Sugerencia de formato
    ponderacionActividadEvaluativaLineEdit->setText("10.0"); // Valor por defecto en string
    ponderacionEvalLayout->addWidget(ponderacionActividadEvaluativaLineEdit);
    evaluacionLayout->addLayout(ponderacionEvalLayout);

    mainLayout->addWidget(evaluacionGroup);

    // Conectar el checkbox para habilitar/deshabilitar campos
    connect(esEvaluativaCheckBox, &QCheckBox::toggled, this, &AddTareaDialog::on_esEvaluativa_toggled);
    // Estado inicial: campos deshabilitados
    on_esEvaluativa_toggled(false); // Llamar una vez para establecer el estado inicial


    // Botones OK y Cancelar
    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, &AddTareaDialog::accept);
    connect(cancelButton, &QPushButton::clicked, this, &AddTareaDialog::reject);
}


// Métodos para obtener los datos
QString AddTareaDialog::getNombre() const {
    return nombreLineEdit->text();
}

QString AddTareaDialog::getDescripcion() const {
    return descripcionTextEdit->toPlainText();
}

QDate AddTareaDialog::getFechaInicio() const {
    return fechaInicioDateTimeEdit->date();
}

QDate AddTareaDialog::getFechaFin() const {
    return fechaFinDateTimeEdit->date();
}

int AddTareaDialog::getRamoIdSeleccionado() const {
    QString selectedRamoName = ramoComboBox->currentText();
    return ramoNameToIdMap.value(selectedRamoName, 0); // Retorna 0 si no se encuentra
}

QDate AddTareaDialog::getFechaEntrega() const {
    return fechaFinDateTimeEdit->date(); // La fecha de entrega es la fecha de fechaFin
}



float AddTareaDialog::getEstimacionHoras() const {
    return static_cast<float>(estimacionHorasSpinBox->value());
}

void AddTareaDialog::on_esEvaluativa_toggled(bool checked) {
    nombreActividadEvaluativaLineEdit->setEnabled(checked);
    ponderacionActividadEvaluativaLineEdit->setEnabled(checked);
}

// ¡Nuevos getters para Actividad Evaluativa!
bool AddTareaDialog::esEvaluativa() const {
    return esEvaluativaCheckBox->isChecked();
}

QString AddTareaDialog::getNombreActividadEvaluativa() const {
    return nombreActividadEvaluativaLineEdit->text();
}

QString AddTareaDialog::getPonderacionActividadEvaluativaString() const {
    return ponderacionActividadEvaluativaLineEdit->text(); 
}

void AddTareaDialog::accept() {
    if (esEvaluativaCheckBox->isChecked()) {
        QString ponderacionText = ponderacionActividadEvaluativaLineEdit->text().trimmed();
        if (nombreActividadEvaluativaLineEdit->text().trimmed().isEmpty()) {
            QMessageBox::warning(const_cast<AddTareaDialog*>(this), "Error de Validación", "Si la actividad es evaluativa, el nombre de la evaluación es obligatorio.");
            return;
        }
        // Llamada a la función estática sin necesidad de 'this->'
        float ponderacionValue = AddTareaDialog::evaluatePonderationExpression(ponderacionText);
        if (ponderacionValue == 0.0f && ponderacionText != "0" && !ponderacionText.isEmpty()) {
            QMessageBox::warning(const_cast<AddTareaDialog*>(this), "Error de Ponderación",
                                 QString("La expresión de ponderación '%1' no es válida o resulta en cero.")
                                 .arg(ponderacionText));
            return;
        }
    }
    QDialog::accept();
}
