// calendarviewwidget.cpp
#include "CalendarViewWidget.h"
#include "ui_calendarviewwidget.h" // Include the generated UI header

#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QMessageBox>
#include <QDebug> // For qWarning()

CalendarViewWidget::CalendarViewWidget(QWidget *parent)
    : QWidget(parent),
    ui(new Ui::CalendarViewWidget) // Initialize the UI object
{
    ui->setupUi(this); // Set up the widgets defined in calendarviewwidget.ui

    // Connect the slot for when a date is selected in the calendar
    connect(ui->calendarWidget, &QCalendarWidget::clicked, this, &CalendarViewWidget::on_calendarWidget_clicked);

    // Load events on initialization
    m_eventsFilePath = "datos_planner.json";
    loadEventsFromJson(m_eventsFilePath);
}

CalendarViewWidget::~CalendarViewWidget()
{
    delete ui; // Delete the UI object
}


void CalendarViewWidget::loadEventsFromJson(const QString& filePath)
{
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qWarning() << "Could not open JSON file:" << file.errorString() << "at path:" << filePath;
        m_events.clear();
        updateCalendarHighlights();
        // ui->eventDetailsTextEdit->setText("No se encontraron eventos o el archivo 'datos_planner.json' no existe."); // Descomentar si usas ui
        return;
    }

    QByteArray jsonData = file.readAll();
    file.close();

    QJsonDocument doc = QJsonDocument::fromJson(jsonData);

    if (doc.isNull() || !doc.isObject()) { // Asegurarse que es un objeto raíz
        QMessageBox::critical(this, "Error JSON", "El archivo JSON de eventos no es válido o no es un objeto raíz.");
        m_events.clear();
        updateCalendarHighlights();
        return;
    }

    m_events.clear(); // Limpiar eventos anteriores antes de cargar nuevos

    QJsonObject rootObject = doc.object();

    // Lógica para cargar Actividades Académicas de RAMOS (actividadesEvaluativas anidadas)
    if (rootObject.contains("ramos") && rootObject["ramos"].isArray()) {
        QJsonArray ramosArray = rootObject["ramos"].toArray();
        for (const QJsonValue& ramoValue : ramosArray) {
            if (ramoValue.isObject()) {
                QJsonObject ramoObject = ramoValue.toObject();
                QString ramoNombre = ramoObject["nombre"].toString(); // Obtener el nombre del ramo para referencia

                if (ramoObject.contains("actividadesEvaluativas") && ramoObject["actividadesEvaluativas"].isArray()) {
                    QJsonArray actividadesEvalArray = ramoObject["actividadesEvaluativas"].toArray();
                    for (const QJsonValue& actValue : actividadesEvalArray) {
                        if (actValue.isObject()) {
                            QJsonObject actividadObject = actValue.toObject();
                            qDebug() << "Procesando actividad evaluativa:" << actividadObject["nombre"].toString()
                                     << "en ramo:" << ramoNombre;
                            // Extraer los datos relevantes para tu struct Event
                            QString name = actividadObject["nombre"].toString();
                            // Asumo que la fecha relevante para el calendario es 'fechaFin' de ActividadAcademica
                            QDate date = QDate::fromString(actividadObject["fechaFin"].toString().split("T").first(), "yyyy-MM-dd");
                            QString description = actividadObject["descripcion"].toString(); // Podría estar vacía para ActividadAcademica base
                            float ponderacion = static_cast<float>(actividadObject["ponderacion"].toDouble());
                            float notaObtenida = static_cast<float>(actividadObject["notaObtenida"].toDouble(-1.0));
                            bool estaCompletada = actividadObject["estaCompletada"].toBool(false);
                            QString tipoActividad = actividadObject["tipoActividad"].toString();


                            // Puedes enriquecer la descripción o el nombre con datos del ramo o evaluación
                            QString eventDescription = QString("Ramo: %1 | Tipo: %2 | Ponderación: %3% | Nota: %4 | Descripción: %5")
                                                           .arg(ramoNombre)
                                                           .arg(tipoActividad)
                                                           .arg(ponderacion, 0, 'f', 1)
                                                           .arg(notaObtenida != -1.0f ? QString::number(notaObtenida, 'f', 1) : "N/R")
                                                           .arg(description.isEmpty() ? "No disponible" : description);

                            QString eventName = name;
                            if (estaCompletada) eventName += " (Completada)";
                            if (notaObtenida != -1.0f) eventName += QString(" (%1)").arg(QString::number(notaObtenida, 'f', 1));


                            if (date.isValid() && !name.isEmpty()) {
                                m_events.append(Event{eventName, date, eventDescription});
                            } else {
                                qWarning() << "Actividad evaluativa inválida encontrada en ramo" << ramoNombre << ". Nombre:" << name << ", Fecha:" << actividadObject["fechaFin"].toString();
                            }
                        }
                    }
                }
            }
        }
    }

    updateCalendarHighlights();
    // Actualizar los detalles para la fecha actualmente seleccionada (e.g., la fecha de hoy inicialmente)
    // on_calendarWidget_clicked(ui->calendarWidget->selectedDate()); // Descomentar si usas ui->calendarWidget
}

/*
void CalendarViewWidget::updateCalendarHighlights()
{
    // First, clear all formats for the currently visible month to ensure old highlights are removed
    QTextCharFormat defaultFormat; // Default format (no highlighting)
    // Iterate through all days of the currently selected month and reset their format
    QDate currentMonthDate = ui->calendarWidget->selectedDate();
    int year = currentMonthDate.year();
    int month = currentMonthDate.month();
    int daysInMonth = currentMonthDate.daysInMonth();

    for (int day = 1; day <= daysInMonth; ++day) {
        ui->calendarWidget->setDateTextFormat(QDate(year, month, day), defaultFormat);
    }

    // Define the highlight format
    QTextCharFormat highlightFormat;
    highlightFormat.setBackground(Qt::yellow);
    highlightFormat.setForeground(Qt::darkBlue);
    highlightFormat.setFontWeight(QFont::Bold);

    // Apply highlight format to dates with events
    for (const Event& event : m_events) {
        ui->calendarWidget->setDateTextFormat(event, highlightFormat);
    }
}
*/

void CalendarViewWidget::updateCalendarHighlights()
{
    // Limpia todos los formatos del calendario
    ui->calendarWidget->setDateTextFormat(QDate(), QTextCharFormat());

    // Formato de resaltado
    QTextCharFormat highlightFormat;
    highlightFormat.setBackground(Qt::yellow);
    highlightFormat.setForeground(Qt::darkBlue);
    highlightFormat.setFontWeight(QFont::Bold);

    // Solo fechas válidas
    QSet<QDate> fechasValidas;
    for (const Event& event : m_events) {
        if (event.date().isValid()) {
            fechasValidas.insert(event.date());
        }
    }

    // Pintar las fechas válidas
    for (const QDate& fecha : fechasValidas) {
        ui->calendarWidget->setDateTextFormat(fecha, highlightFormat);
    }
}


void CalendarViewWidget::on_calendarWidget_clicked(const QDate& date)
{
    QString eventInfo;
    bool foundEvents = false;

    for (const Event& event : m_events) {
        if (event.date() == date) {
            eventInfo += "<b>" + event.name() + "</b><br>";
            eventInfo += event.description() + "<br><br>";
            foundEvents = true;
        }
    }

    if (foundEvents) {
        ui->eventDetailsTextEdit->setHtml(eventInfo);
    } else {
        ui->eventDetailsTextEdit->setText("No hay eventos para esta fecha.");
    }
}

void CalendarViewWidget::refreshCalendarDisplay()
{
    // Reload events from the file and refresh highlights
    loadEventsFromJson(m_eventsFilePath);
}
