#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "chatwindow.h"
#include <QMessageBox>
#include <QListWidget>
#include <QVBoxLayout>
#include <QDebug>
#include <QFile>
#include <QResizeEvent>
#include <QCoreApplication>
#include <QDir>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //cargarUsuariosDesdeCSV("C:/Users/Diego/Documents/QT/proyecto_3/datos/usuarios.csv");
    QString rutaCSV = QCoreApplication::applicationDirPath() + QDir::separator() + "datos" + QDir::separator() + "usuarios.csv";
    cargarUsuariosDesdeCSV(rutaCSV);

    mostrarUsuarioActual();
    conectarSenales();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::conectarSenales()
{
    connect(ui->botonLike, &QPushButton::clicked, this, &MainWindow::manejarLike);
    connect(ui->botonDislike, &QPushButton::clicked, this, &MainWindow::manejarDislike);
    connect(ui->btnVerMatches, &QPushButton::clicked, this, &MainWindow::mostrarListaMatches);
}

void MainWindow::cargarUsuariosDesdeCSV(const QString &rutaArchivo)
{
    QFile archivo(rutaArchivo);
    if (!archivo.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QMessageBox::warning(this, "Error", "No se pudo abrir el archivo: " + rutaArchivo);
        return;
    }

    QTextStream in(&archivo);
    bool primeraLinea = true;

    while (!in.atEnd()) {
        QString linea = in.readLine();
        if (primeraLinea) {
            primeraLinea = false;
            continue;
        }

        QStringList campos = linea.split(',');
        if (campos.size() < 6) continue;

        QString nombre = campos[0].trimmed();
        QString carrera = campos[1].trimmed();
        int edad = campos[2].toInt();
        bool dioLike = campos[3].trimmed() == "1";
        QString intereses = campos[4].trimmed().replace("\"", "");
        QString rutaImagen = campos[5].trimmed();

        Usuario nuevoUsuario(nombre, carrera, edad, dioLike, rutaImagen);

        QStringList listaIntereses = intereses.split(';');
        for (const QString &interes : listaIntereses) {
            nuevoUsuario.agregarInteres(interes.trimmed());
        }

        usuarios.append(nuevoUsuario);
    }
    archivo.close();
}

void MainWindow::mostrarUsuarioActual()
{
    if (usuarioActualIndex < usuarios.size()) {
        const Usuario &usuario = usuarios[usuarioActualIndex];
        ui->labelNombre->setText("Nombre: " + usuario.getNombre());
        ui->labelCarrera->setText("Carrera: " + usuario.getCarrera());
        ui->labelIntereses->setText("Intereses: " + usuario.getIntereses());

        QPixmap imagen = usuario.getImagen();
        if (!imagen.isNull()) {
            ui->labelImagen->setPixmap(imagen.scaled(ui->labelImagen->width(),
                                                     ui->labelImagen->height(),
                                                     Qt::KeepAspectRatio,
                                                     Qt::SmoothTransformation));
        } else {
            ui->labelImagen->setText("No hay imagen disponible");
            ui->labelImagen->setAlignment(Qt::AlignCenter);
        }
    } else {
        QMessageBox::information(this, "Fin", "¡No hay más usuarios disponibles!");
        usuarioActualIndex = 0;
        mostrarUsuarioActual();
    }
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
    QMainWindow::resizeEvent(event);
    mostrarUsuarioActual(); // Redimensionar la imagen cuando cambie el tamaño de la ventana
}

void MainWindow::manejarLike() {
    if (usuarioActualIndex < usuarios.size()) {
        // Solo procesar si no es mi propio perfil
        if (usuarioActualIndex != miUsuarioIndex) {
            likesDados.append(usuarioActualIndex);
            verificarMatches(usuarioActualIndex);
        }
        usuarioActualIndex++;
        mostrarUsuarioActual();
    }
}

void MainWindow::manejarDislike() {
    // Solo procesar si no es mi propio perfil
    if (usuarioActualIndex != miUsuarioIndex) {
        likesDados.removeAll(usuarioActualIndex);
    }
    usuarioActualIndex++;
    mostrarUsuarioActual();
}

void MainWindow::verificarMatches(int usuarioIndex) {
    // No verificar matches con uno mismo
    if (usuarioIndex == miUsuarioIndex) return;

    const Usuario &usuarioActual = usuarios[usuarioIndex];

    // Solo crear match si:
    // 1. El otro usuario me dio like (según CSV)
    // 2. Y yo le di like ahora
    if (usuarioActual.dioLike() && likesDados.contains(usuarioIndex)) {
        // Verificar que no exista ya este match
        bool matchExistente = false;
        for (const auto &match : m_matches) {
            if (match.second == usuarioIndex) {
                matchExistente = true;
                break;
            }
        }

        if (!matchExistente) {
            m_matches.append(qMakePair(miUsuarioIndex, usuarioIndex));
            QMessageBox::information(this, "¡Match!",
                                     QString("¡Tienes un match con %1!").arg(usuarioActual.getNombre()));
            actualizarContadorMatches();
        }
    }
}

void MainWindow::mostrarListaMatches() {
    if (m_matches.isEmpty()) {
        QMessageBox::information(this, "Matches", "Aún no tienes matches");
        return;
    }

    QDialog dialog(this);
    dialog.setWindowTitle("Tus Matches");
    dialog.resize(300, 400);

    QVBoxLayout layout(&dialog);
    QListWidget lista(&dialog);

    for (int i = 0; i < m_matches.size(); ++i) {
        const auto &match = m_matches[i];
        // Solo mostrar el nombre del otro usuario (no mostrar "Tú ↔ Otro")
        QString matchText = usuarios[match.second].getNombre();

        QListWidgetItem *item = new QListWidgetItem(matchText, &lista);
        item->setData(Qt::UserRole, i);
    }

    connect(&lista, &QListWidget::itemClicked, [&](QListWidgetItem *item) {
        int index = item->data(Qt::UserRole).toInt();
        dialog.close();
        abrirChatConUsuario(index);
    });

    layout.addWidget(&lista);
    dialog.exec();
}

void MainWindow::abrirChatConUsuario(int index) {
    if (index >= 0 && index < m_matches.size()) {
        auto match = m_matches[index];
        ChatWindow *chat = new ChatWindow(&usuarios[match.first], &usuarios[match.second], this);
        chat->setAttribute(Qt::WA_DeleteOnClose);
        chat->show();
    }
}

void MainWindow::actualizarContadorMatches()
{
    ui->btnVerMatches->setText(QString("Ver Matches (%1)").arg(m_matches.size()));
}
