#include "demandeabsence.h"
#include "ui_demandeabsence.h"

demandeAbsence::demandeAbsence(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::demandeAbsence)
{
    ui->setupUi(this);
    verifconnexion();
    afficher();
    on_absencerRadioButton_clicked();
    setupContextMenu();
}

demandeAbsence::~demandeAbsence()
{
    delete ui;
}

void demandeAbsence::getmatUser_tb(QString usr){
    matUser = usr;
    joursDisponibles = calculerJoursCongesDisponibles(ui->matricule_comboBox->currentText());
}

void demandeAbsence::getgroupName_tb(QString grp){
    groupName = grp;
}

void demandeAbsence::recServeurType_tb(QString serv){
    serveur = serv;
}

void demandeAbsence::chargerMatricules()
{
    QSqlQuery query;
    ui->matricule_comboBox->clear();

    ui->matricule_comboBox->addItem("", "");

    query.prepare("SELECT matricule FROM agents ORDER BY matricule");

    if (query.exec()) {
        while (query.next()) {
            QString matricule = query.value(0).toString();
            ui->matricule_comboBox->addItem(matricule, matricule);
        }
    } else {
        QMessageBox::critical(this, "Erreur",
                              "Erreur lors du chargement des matricules: " +
                                  query.lastError().text());
    }
}

void demandeAbsence::afficher() {
    QSqlQuery requet;
    int ligne = 0;

    model = new QStandardItemModel(0, 14);
    requet.exec(R"(
        SELECT absences.id, absences.matricule, absences.type_demande, absences.type_conge,
               absences.motif_absence, absences.date_debut, absences.date_fin,
               absences.jours_demandes, absences.commentaire, absences.statut,
               absences.approbateur, absences.date_soumission, agents.num_cnss, absences.programme
        FROM absences
        LEFT JOIN agents ON absences.matricule = agents.matricule
        ORDER BY absences.id DESC
    )");

    while (requet.next()) {
        QStandardItem* item = new QStandardItem;

        item = new QStandardItem(QString::number(requet.value(0).toInt()));
        model->setItem(ligne, 0, item);

        item = new QStandardItem(requet.value(1).toString()); // Matricule
        model->setItem(ligne, 1, item);

        item = new QStandardItem(requet.value(2).toString());
        model->setItem(ligne, 2, item);

        item = new QStandardItem(requet.value(3).toString());
        model->setItem(ligne, 3, item);

        item = new QStandardItem(requet.value(4).toString());
        model->setItem(ligne, 4, item);

        item = new QStandardItem(requet.value(5).toDate().toString("dd/MM/yyyy"));
        model->setItem(ligne, 5, item);

        item = new QStandardItem(requet.value(6).toDate().toString("dd/MM/yyyy"));
        model->setItem(ligne, 6, item);

        item = new QStandardItem(QString::number(requet.value(7).toInt()));
        model->setItem(ligne, 7, item);

        item = new QStandardItem(requet.value(8).toString());
        model->setItem(ligne, 8, item);

        item = new QStandardItem(requet.value(9).toString());
        model->setItem(ligne, 9, item);

        item = new QStandardItem(requet.value(10).toString());
        model->setItem(ligne, 10, item);

        item = new QStandardItem(requet.value(11).toDate().toString("dd/MM/yyyy"));
        model->setItem(ligne, 11, item);

        item = new QStandardItem(requet.value(12).toString());
        model->setItem(ligne, 12, item);

        item = new QStandardItem(requet.value(13).toString());
        model->setItem(ligne, 13, item);

        QString statut = requet.value(9).toString();
        QColor couleur;
        if (statut == "en attente") {
            couleur = QColor(255, 255, 204); // Jaune pâle
        } else if (statut == "approuvee") {
            couleur = QColor(204, 255, 204); // Vert doux
        } else if (statut == "refusee") {
            couleur = QColor(255, 204, 204); // Rouge clair
        }else
            couleur = QColor(255, 255, 255); // blanc
        for (int col = 0; col < 14; ++col) {
            model->item(ligne, col)->setBackground(couleur);
        }

        ++ligne;
    }

    model->setHeaderData(0, Qt::Horizontal, "Numero");
    model->setHeaderData(1, Qt::Horizontal, "Matricule");
    model->setHeaderData(2, Qt::Horizontal, "Type de demande");
    model->setHeaderData(3, Qt::Horizontal, "Type de congé");
    model->setHeaderData(4, Qt::Horizontal, "Motif absence");
    model->setHeaderData(5, Qt::Horizontal, "Date début");
    model->setHeaderData(6, Qt::Horizontal, "Date fin");
    model->setHeaderData(7, Qt::Horizontal, "Jours demandés");
    model->setHeaderData(8, Qt::Horizontal, "Commentaire");
    model->setHeaderData(9, Qt::Horizontal, "Statut");
    model->setHeaderData(10, Qt::Horizontal, "Approbateur");
    model->setHeaderData(11, Qt::Horizontal, "Date de soumission");
    model->setHeaderData(12, Qt::Horizontal, "Numéro CNSS");
    model->setHeaderData(13, Qt::Horizontal, "Programme");

    ui->tableView->setModel(model);
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

    ui->tableView->setColumnWidth(0, 80);
    ui->tableView->setColumnWidth(1, 100);
    ui->tableView->setColumnWidth(2, 120);
    ui->tableView->setColumnWidth(3, 120);
    ui->tableView->setColumnWidth(4, 120);
    ui->tableView->setColumnWidth(5, 100);
    ui->tableView->setColumnWidth(6, 100);
    ui->tableView->setColumnWidth(7, 100);
    ui->tableView->setColumnWidth(8, 150);
    ui->tableView->setColumnWidth(9, 100);
    ui->tableView->setColumnWidth(10, 150);
    ui->tableView->setColumnWidth(11, 120);
    ui->tableView->setColumnWidth(12, 100);
    ui->tableView->setColumnWidth(13, 120);

    ui->dateTimeDebutEdit->setDate(QDate::currentDate());
    ui->dateTimeFinEdit->setDate(QDate::currentDate());

    chargerMatricules();
}
void demandeAbsence::on_matricule_comboBox_currentTextChanged(const QString &matricule)
{
    if (matricule.isEmpty()) {
        ui->nomEdit->clear();
        ui->prenomEdit->clear();
        ui->posteEdit->clear();
        ui->cnss_lineEdit->clear();
        return;
    }

    QSqlQuery query;
    query.prepare("SELECT nom, prenom, poste, num_cnss FROM agents WHERE matricule = :matricule");
    query.bindValue(":matricule", matricule);

    if (query.exec() && query.next()) {
        ui->nomEdit->setText(query.value("nom").toString());
        ui->prenomEdit->setText(query.value("prenom").toString());
        ui->posteEdit->setText(query.value("poste").toString());
        ui->cnss_lineEdit->setText(query.value("num_cnss").toString());
    } else {
        ui->nomEdit->clear();
        ui->prenomEdit->clear();
        ui->posteEdit->clear();
        ui->cnss_lineEdit->clear();
        QMessageBox::warning(this, "Erreur", "Aucune information trouvée pour ce matricule.");
    }

    QSqlQuery queryProjet;
    queryProjet.prepare("SELECT projet.nom_projet FROM project_agents "
                        "INNER JOIN projet ON project_agents.code_projet = projet.code_projet "
                        "WHERE project_agents.date_retirer IS NULL AND project_agents.date_promotion IS NULL");
    ui->programme_comboBox->clear();

    if (queryProjet.exec()) {
        while (queryProjet.next()) {
            ui->programme_comboBox->addItem(queryProjet.value(0).toString());
        }

        if (ui->programme_comboBox->count() == 0) {
            QMessageBox::warning(this, "Information", "Aucun projet en cours trouvé.");
        }
    } else {
        QMessageBox::warning(this, "Erreur", "Impossible de charger les projets en cours. Erreur : " + queryProjet.lastError().text());
    }
}


void demandeAbsence::remplirInfosAgent(QString matricule)
{

}

double demandeAbsence::calculerJoursCongesDisponibles(const QString &matricule) {
    double joursMensuelsDispo = 0.0;
    double nombreMoisTravail = 0.0;
    double joursPris = 0.0;

    // Récupération de joursMensueldispo depuis la table cf_jours_conges_dispo
    QSqlQuery requet0;
    requet0.exec(R"(
        SELECT jours_disponibles
        FROM cf_jours_conges_dispo
        WHERE date_fin IS NULL
    )");

    if (requet0.next()) {
        joursMensuelsDispo = requet0.value(0).toDouble();
    } else {
        QMessageBox::warning(this, "Erreur", "Impossible de récupérer le nombre de jours disponibles.");
        return 0.0;
    }

    // Récupération de l'année courante depuis la date serveur
    QSqlQuery req;
    req.exec("SELECT localtime");
    int anneeCourante = QDateTime::currentDateTime().date().year();
    if (req.next()) {
        anneeCourante = req.value(0).toDateTime().date().year();
    }

    // Calcul du nombre de mois distincts travaillés pour l'année du serveur
    QSqlQuery queryMois;
    queryMois.prepare(R"(
        SELECT COUNT(DISTINCT MONTH(date_heure))
        FROM pointages
        WHERE matricule = :matricule AND YEAR(date_heure) = :annee
    )");
    queryMois.bindValue(":matricule", matricule);
    queryMois.bindValue(":annee", anneeCourante);

    if (queryMois.exec() && queryMois.next()) {
        nombreMoisTravail = queryMois.value(0).toDouble();
    }

    // Calcul du nombre total de jours de congé disponibles pour l'année en cours
    double joursTotalDispo = nombreMoisTravail * joursMensuelsDispo;

    // Calcul du nombre de jours de congé pris, excluant les congés de maternité
    QSqlQuery queryCongesPris;
    queryCongesPris.prepare(R"(
        SELECT SUM(jours_demandes)
        FROM absences
        WHERE matricule = :matricule
              AND type_demande = 'conge'
              AND statut = 'approuvee'
              AND YEAR(date_debut) = :annee
              AND type_conge = 'Administratif'
    )");
    queryCongesPris.bindValue(":matricule", matricule);
    queryCongesPris.bindValue(":annee", anneeCourante);

    if (queryCongesPris.exec() && queryCongesPris.next()) {
        joursPris = queryCongesPris.value(0).toDouble();
    }
    return joursTotalDispo - joursPris;
}

void demandeAbsence::on_congeRadioButton_clicked()
{
    ui->motifLabel->setText("Type de congés");
    ui->joursAbsencesLabel->setText("Jours de congés");
    ui->formGroupBox->setTitle("Demande de congés");
    ui->jours_dispo_spinBox->setValue(joursDisponibles);

    ui->label_jours_dipo->setVisible(true);
    ui->jours_dispo_spinBox->setVisible(true);

    QSqlQuery req;
    QString motif;
    req.exec("SELECT motif FROM cf_motif WHERE type = 'Congé'");
    ui->motifComboBox->clear();
    while (req.next()) {
        motif = req.value(0).toString();
        ui->motifComboBox->addItem(motif);
    }
}

void demandeAbsence::on_absencerRadioButton_clicked()
{
    ui->motifLabel->setText("Motif");
    ui->joursAbsencesLabel->setText("Jours d'absences");
    ui->formGroupBox->setTitle("Demande Absences");

    ui->label_jours_dipo->setVisible(false);
    ui->jours_dispo_spinBox->setVisible(false);

    QSqlQuery req;
    QString motif;
    req.exec("SELECT motif FROM cf_motif WHERE type = 'Absence'");
    ui->motifComboBox->clear();
    while (req.next()) {
        motif = req.value(0).toString();
        ui->motifComboBox->addItem(motif);
    }
}

bool demandeAbsence::validateFormulaire() {
    if (ui->congeRadioButton->isChecked()) {
        if (ui->joursDemandeSpinBox->value() == 0) {
            QMessageBox::warning(this, "Erreur", "Le nombre de jours demandés est obligatoire.");
            return false;
        }
        if (ui->joursDemandeSpinBox->value() > joursDisponibles) {
            QMessageBox::warning(this,"Erreur", "Vous ne pouvez pas demander plus de jours que les jours disponibles.");
            return false;
        }

        if (ui->dateTimeDebutEdit->dateTime() > ui->dateTimeFinEdit->dateTime()) {
            QMessageBox::warning(this,"Erreur", "La date de début du congé ne peut pas être postérieure à la date de fin.");
            return false;
        }
    }

    if (ui->absencerRadioButton->isChecked()) {
        if (ui->joursDemandeSpinBox->value() == 0) {
            QMessageBox::warning(this,"Erreur", "Le nombre de jours d'absence est obligatoire.");
            return false;
        }

        if (ui->commentaireTextEdit->toPlainText().isEmpty()) {
            QMessageBox::warning(this,"Erreur", "Le motif de l'absence est obligatoire.");
            return false;
        }

        if (ui->dateTimeDebutEdit->dateTime() > ui->dateTimeFinEdit->dateTime()) {
            QMessageBox::warning(this,"Erreur", "La date de début de l'absence ne peut pas être postérieure à la date de fin.");
            return false;
        }
    }

    return true;
}

void demandeAbsence::on_soumettrePushButton_clicked()
{
    if (!validateFormulaire()) {
        return;
    }

    if (ui->matricule_comboBox->currentText().isEmpty()) {
        QMessageBox::warning(this, "Erreur", "Erreur lors du chargement des informations de l'employé.");
        return;
    }

    QString matricule = ui->matricule_comboBox->currentText();
    QString typeDemande;
    int joursDemandes = ui->joursDemandeSpinBox->value();
    QDate dateDebut = ui->dateTimeDebutEdit->date();
    QDate dateFin = ui->dateTimeFinEdit->date();
    QString motif;
    QString typeConge;
    QString commentaire = ui->commentaireTextEdit->toPlainText();
    QDate dateSoumission = QDate::currentDate();
    QString programme = ui->programme_comboBox->currentText();

    if (ui->congeRadioButton->isChecked()) {
        typeDemande = "conge";
        motif = "";
        typeConge = ui->motifComboBox->currentText();
    } else if (ui->absencerRadioButton->isChecked()) {
        typeDemande = "absence";
        motif = ui->motifComboBox->currentText();
        typeConge = "";
    }

    QSqlQuery query;
    query.prepare("INSERT INTO absences (matricule, type_demande, type_conge, motif_absence, "
                  "date_debut, date_fin, jours_demandes, commentaire, date_soumission, cnss, programme) "
                  "VALUES (:matricule, :type_demande, :type_conge, :motif_absence, "
                  ":date_debut, :date_fin, :jours_demandes, :commentaire, :date_soumission,:programme)");

    query.bindValue(":matricule", matricule);
    query.bindValue(":type_demande", typeDemande);
    query.bindValue(":type_conge", typeConge);
    query.bindValue(":motif_absence", motif);
    query.bindValue(":date_debut", dateDebut);
    query.bindValue(":date_fin", dateFin);
    query.bindValue(":jours_demandes", joursDemandes);
    query.bindValue(":commentaire", commentaire);
    query.bindValue(":date_soumission", dateSoumission);
    query.bindValue(":programme", programme);

    if (query.exec()) {
        QMessageBox::information(this, "Succès", "Demande soumise avec succès.");
    } else {
        QMessageBox::warning(this, "Erreur", "Échec de la soumission de la demande. Erreur : " + query.lastError().text());
    }
    afficher();
}


void demandeAbsence::on_tableView_doubleClicked(const QModelIndex &index)
{
    indextable = model->index(index.row(), 0);
    ui->numeroDemandeLabel->setText(model->data(indextable, Qt::DisplayRole).toString());

    indextable = model->index(index.row(), 1);
    ui->matricule_comboBox->setCurrentText(model->data(indextable, Qt::DisplayRole).toString());

    QString typeDemande = model->data(indextable, Qt::DisplayRole).toString();

    if (typeDemande == "conge") {
        on_congeRadioButton_clicked();
        indextable = model->index(index.row(), 2);
        ui->motifComboBox->setCurrentText(model->data(indextable, Qt::DisplayRole).toString());
    } else {
        on_absencerRadioButton_clicked();
        indextable = model->index(index.row(), 3);
        ui->motifComboBox->setCurrentText(model->data(indextable, Qt::DisplayRole).toString());
    }

    indextable = model->index(index.row(), 4);
    ui->dateTimeDebutEdit->setDateTime(QDateTime::fromString(model->data(indextable, Qt::DisplayRole).toString(), "yyyy-MM-dd HH:mm:ss"));

    indextable = model->index(index.row(), 5);
    ui->dateTimeFinEdit->setDateTime(QDateTime::fromString(model->data(indextable, Qt::DisplayRole).toString(), "yyyy-MM-dd HH:mm:ss"));

    indextable = model->index(index.row(), 6);
    ui->joursDemandeSpinBox->setValue(model->data(indextable, Qt::DisplayRole).toInt());

    indextable = model->index(index.row(), 7);
    ui->commentaireTextEdit->setPlainText(model->data(indextable, Qt::DisplayRole).toString());

    indextable = model->index(index.row(), 11);
    ui->cnss_lineEdit->setText(model->data(indextable, Qt::DisplayRole).toString());

    indextable = model->index(index.row(), 12);
    ui->programme_comboBox->setCurrentText(model->data(indextable, Qt::DisplayRole).toString());
}



void demandeAbsence::on_modifierPushButton_clicked()
{
    if (ui->numeroDemandeLabel->text().isEmpty()) {
        QMessageBox::warning(this, "ERREUR", "Veuillez sélectionner la demande à modifier");
        return;
    }

    if (!validateFormulaire()) {
        return;
    }

    int idDemande = ui->numeroDemandeLabel->text().toInt();
    QSqlQuery requet;
    requet.prepare("SELECT COUNT(id) FROM absences WHERE id = :id");
    requet.bindValue(":id", idDemande);

    if (!requet.exec() || !requet.next() || requet.value(0).toInt() != 1) {
        QMessageBox::warning(this, "Erreur", "Aucune demande trouvée avec cet identifiant ou erreur de requête : " + requet.lastError().text());
        return;
    }

    QSqlQuery query;
    query.prepare(R"(
        UPDATE absences
        SET type_demande = :type_demande, type_conge = :type_conge, motif_absence = :motif_absence,
            date_debut = :date_debut, date_fin = :date_fin, jours_demandes = :jours_demandes,
            commentaire = :commentaire, cnss = :cnss, programme = :programme
        WHERE id = :id
    )");

    QString typeDemande;
    QString typeConge;
    QString motifAbsence;

    if (ui->congeRadioButton->isChecked()) {
        typeDemande = "conge";
        typeConge = ui->motifComboBox->currentText();
        motifAbsence = "";
    } else if (ui->absencerRadioButton->isChecked()) {
        typeDemande = "absence";
        typeConge = "";
        motifAbsence = ui->motifComboBox->currentText();
    } else {
        QMessageBox::warning(this, "Erreur", "Veuillez sélectionner un type de demande.");
        return;
    }

    query.bindValue(":type_demande", typeDemande);
    query.bindValue(":type_conge", typeConge);
    query.bindValue(":motif_absence", motifAbsence);
    query.bindValue(":date_debut", ui->dateTimeDebutEdit->date().toString("yyyy-MM-dd"));
    query.bindValue(":date_fin", ui->dateTimeFinEdit->date().toString("yyyy-MM-dd"));
    query.bindValue(":jours_demandes", ui->joursDemandeSpinBox->value());
    query.bindValue(":commentaire", ui->commentaireTextEdit->toPlainText());
    query.bindValue(":cnss", ui->cnss_lineEdit->text());
    query.bindValue(":programme", ui->programme_comboBox->currentText());
    query.bindValue(":id", idDemande);

    if (query.exec()) {
        afficher();
        QMessageBox::information(this, "Statut modification", "Modification réussie");
        effacer();
    } else {
        QMessageBox::warning(this, "Erreur", "La modification a échoué : " + query.lastError().text());
    }
}



void demandeAbsence::setupContextMenu() {
    ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->tableView, &QTableView::customContextMenuRequested, this, &demandeAbsence::on_tableView_customContextMenuRequested);
}


void demandeAbsence::on_tableView_customContextMenuRequested(const QPoint &pos) {
    QMenu contextMenu(tr("Options"), this);

    QAction action3("Valider", this);
    connect(&action3, &QAction::triggered, this, &demandeAbsence::valider);
    contextMenu.addAction(&action3);

    QAction action4("Rejeter", this);
    connect(&action4, &QAction::triggered, this, &demandeAbsence::rejeter);
    contextMenu.addAction(&action4);

    QAction actionImprimer("Imprimer Titre de Congé", this);
    connect(&actionImprimer, &QAction::triggered, this, &demandeAbsence::imprimerTitreConges);
    contextMenu.addAction(&actionImprimer);

    contextMenu.exec(ui->tableView->mapToGlobal(pos));
}


void demandeAbsence::valider() {
    QModelIndexList selection = ui->tableView->selectionModel()->selectedRows();
    if (selection.isEmpty()) {
        QMessageBox::warning(this, "Erreur", "Veuillez sélectionner une demande dans la table pour valider.");
        return;
    }

    QString idDemande = model->data(model->index(selection.first().row(), 0)).toString();
    QString matricule = model->data(model->index(selection.first().row(), 1)).toString(); // Récupérer le matricule
    QSqlQuery requete;
    requete.prepare("SELECT count(*) FROM cf_avoir_droit WHERE nom_groupe = :groupName AND code_droit = 1");
    requete.bindValue(":groupName", groupName);
    requete.exec();

    if (requete.next() && requete.value(0).toInt() > 0) {
        QString poste;
        QSqlQuery queryPoste;
        queryPoste.prepare("SELECT poste FROM agents WHERE matricule = :matricule");
        queryPoste.bindValue(":matricule", matricule);
        queryPoste.exec();

        if (queryPoste.next()) {
            poste = queryPoste.value(0).toString();
        }

        QSqlQuery query;
        query.prepare("UPDATE absences SET statut = 'approuvee', approbateur = :approbateur WHERE id = :id");
        query.bindValue(":id", idDemande);
        query.bindValue(":approbateur", poste);

        if (query.exec()) {
            QMessageBox::information(this, "Succès", "La demande a été validée avec succès.");
            afficher();
        } else {
            QMessageBox::warning(this, "Erreur", "Échec de la validation. Erreur : " + query.lastError().text());
        }
    } else {
        QMessageBox::warning(this, "Erreur", "Vous n'avez pas les droits nécessaires pour valider cette demande.");
    }
}




void demandeAbsence::rejeter() {
    QModelIndexList selection = ui->tableView->selectionModel()->selectedRows();
    if (selection.isEmpty()) {
        QMessageBox::warning(this, "Erreur", "Veuillez sélectionner une demande pour la rejeter.");
        return;
    }

    int row = selection.first().row();
    QString idDemande = model->data(model->index(row, 0)).toString();
    QString matricule = model->data(model->index(row, 1)).toString(); // Récupérer le matricule
    QSqlQuery requete;
    requete.prepare("SELECT count(*) FROM cf_avoir_droit WHERE nom_groupe = :groupName AND code_droit = 1");
    requete.bindValue(":groupName", groupName);
    requete.exec();

    if (requete.next() && requete.value(0).toInt() > 0) {
        QString poste;
        QSqlQuery queryPoste;
        queryPoste.prepare("SELECT poste FROM agents WHERE matricule = :matricule");
        queryPoste.bindValue(":matricule", matricule);
        queryPoste.exec();

        if (queryPoste.next()) {
            poste = queryPoste.value(0).toString();
        }

        bool ok;
        QString motif = QInputDialog::getText(this, tr("Motif de rejet"), tr("Veuillez saisir le motif du rejet :"), QLineEdit::Normal, QString(), &ok);

        if (ok && !motif.isEmpty()) {
            QSqlQuery query;
            query.prepare("UPDATE absences SET statut = 'refusee', commentaire = :commentaire, approbateur = :approbateur WHERE id = :id");
            query.bindValue(":id", idDemande);
            query.bindValue(":commentaire", motif);
            query.bindValue(":approbateur", poste);

            if (query.exec()) {
                QMessageBox::information(this, "Succès", "La demande a été rejetée avec succès.");
                afficher();
            } else {
                QMessageBox::warning(this, "Erreur", "Échec du rejet de la demande. Erreur : " + query.lastError().text());
            }
        } else {
            QMessageBox::warning(this, "Erreur", "Le motif de rejet est obligatoire.");
        }
    } else {
        QMessageBox::warning(this, "Erreur", "Vous n'avez pas les droits nécessaires pour rejeter cette demande.");
    }
}



void demandeAbsence::imprimerTitreConges() {
    QModelIndexList selection = ui->tableView->selectionModel()->selectedRows();
    if (selection.isEmpty()) {
        QMessageBox::warning(this, "Erreur", "Veuillez sélectionner une demande pour imprimer le titre de congé.");
        return;
    }

    int row = selection.first().row();
    QString idDemande = model->data(model->index(row, 0)).toString();

    // Vérifier le statut de la demande avant de permettre l'impression
    QSqlQuery query;
    query.prepare(R"(
        SELECT statut, type_conge FROM absences WHERE id = :id
    )");
    query.bindValue(":id", idDemande);

    if (!query.exec() || !query.next()) {
        QMessageBox::warning(this, "Erreur", "Échec de la récupération des données de la demande.");
        return;
    }

    QString statutDemande = query.value("statut").toString();
    QString typeConge = query.value("type_conge").toString();

    if (statutDemande != "approuvee") {
        QMessageBox::warning(this, "Erreur", "La demande de congé n'est pas approuvée. Impossible d'imprimer.");
        return;
    }

    // Vérifier le type de congé et imprimer en fonction
    if (typeConge == "Maternité") {
        imprimerTitreCongesMaternite(idDemande);
    } else
        imprimerTitreCongesAdministratifs(idDemande);

}

void demandeAbsence::imprimerTitreCongesMaternite(const QString &idDemande) {
    QSqlQuery query;
    query.prepare(R"(
        SELECT type_conge, nom, prenom, poste, programme, num_cnss,
               date_debut, date_fin, date_soumission
        FROM absences
        JOIN agents ON absences.matricule = agents.matricule
        WHERE absences.id = :id
    )");
    query.bindValue(":id", idDemande);

    if (!query.exec() || !query.next()) {
        QMessageBox::warning(this, "Erreur", "Échec de la récupération des données de la demande.");
        return;
    }

    QString typeConge = query.value("type_conge").toString();
    QString nomEmploye = query.value("nom").toString();
    QString prenomEmploye = query.value("prenom").toString();
    QString poste = query.value("poste").toString();
    QString programme = query.value("programme").toString();
    QString numeroCnss = query.value("num_cnss").toString();
    QDate dateDebutConge = query.value("date_debut").toDate();
    QDate dateFinConge = query.value("date_fin").toDate();
    QDate dateSoumission = query.value("date_soumission").toDate();

    QLocale french(QLocale::French, QLocale::France);
    QString dateDebut = french.toString(dateDebutConge, "dd MMMM yyyy");
    QString dateFin = french.toString(dateFinConge, "dd MMMM yyyy");
    QString dateReprise = french.toString(dateFinConge.addDays(1), "dd MMMM yyyy");
    QString dateSoum = french.toString(dateSoumission, "dd MMMM yyyy");

    if (dateDebutConge.day() == 1) {
        dateDebut = "1er " + french.toString(dateDebutConge, "MMMM yyyy");
    }
    if (dateFinConge.day() == 1) {
        dateFin = "1er " + french.toString(dateFinConge, "MMMM yyyy");
    }

    QString titreConge = R"(
        <html>
            <head>
                <style>
                    body { font-family: 'Times New Roman', serif; font-size: 22px; line-height: 1.6; margin: 40px; }
                    h1 { font-size: 36px; font-weight: bold; line-height: 1.0; text-decoration: underline; text-align: center; }
                    p { text-align: justify; margin: 20px 0; font-size: 22px; line-height: 1.8; }
                    .signature-title { margin-bottom: 30px; }
                </style>
            </head>
            <body>
                <h1>TITRE DE CONGE DE MATERNITE</h1>
                <p><strong>N/Réf:</strong> BS/GRH/0......../24/DE/SIA N'SON-ONG</p>
                <p>Je soussigné, BALOGOUN Salomon, Directeur Exécutif de l'ONG SIA N'SON Développement Communautaire atteste que Mme <strong>)" + prenomEmploye + " " + nomEmploye + R"(</strong>, engagée en qualité de <strong>)" + poste + R"(</strong> pour le <strong>)" + programme + R"(</strong> et affiliée à la CNSS au numéro <strong>)" + numeroCnss + R"(</strong> est bénéficiaire d'un congé de maternité d'une durée de quatorze (14) semaines consécutives qu'elle exécutera conformément aux dispositions légales et règlementaires en vigueur en République du Bénin.</p>
                <p>Conformément à son certificat médical en date du <strong>)" + dateSoum + R"(</strong>, la jouissance de ses congés démarre le <strong>)" + dateDebut + R"(</strong> et prend fin le <strong>)" + dateFin + R"(</strong>.</p>
                <p>La date de reprise de service est fixée au lundi <strong>)" + dateReprise + R"(</strong> à 08 heures précises.</p>
                <p>En foi de quoi, le présent titre de congé de maternité lui est délivré pour servir et valoir ce que de droit.</p>
                <p align="right">Fait à Parakou, le <strong>)" + dateSoum + R"(</strong></p>
                <p align="right" class="signature-title"><strong>Le Directeur Exécutif</strong></p>
                <p align="right">Dr. Salomon BALOGOUN</p>
            </body>
        </html>
    )";

    QPrinter printer;
    QPrintPreviewDialog previewDialog(&printer, this);
    connect(&previewDialog, &QPrintPreviewDialog::paintRequested, [&](QPrinter *printer) {
        QTextDocument doc;
        doc.setHtml(titreConge);
        doc.print(printer);
    });
    previewDialog.showMaximized();
    previewDialog.exec();
}



void demandeAbsence::imprimerTitreCongesAdministratifs(const QString &idDemande) {
    // Récupérer les données pour un congé administratif
    QSqlQuery query;
    query.prepare(R"(
        SELECT type_conge, nom, prenom, poste, date_debut, date_fin, approbateur
        FROM absences
        JOIN agents ON absences.matricule = agents.matricule
        WHERE absences.id = :id AND absences.type_demande = 'conge'
    )");
    query.bindValue(":id", idDemande);

    if (!query.exec() || !query.next()) {
        QMessageBox::warning(this, "Erreur", "Échec de la récupération des données pour le titre de congé administratif.");
        return;
    }

    // Utiliser QLocale pour formater les dates
    QLocale french(QLocale::French, QLocale::France);
    QString dateDebut = french.toString(query.value("date_debut").toDate(), "dd MMMM yyyy");
    QString dateFin = french.toString(query.value("date_fin").toDate(), "dd MMMM yyyy");
    QString dateReprise = french.toString(query.value("date_fin").toDate().addDays(1), "dd MMMM yyyy");

    // Appliquer le format "1er" si le jour est le 1er du mois
    if (query.value("date_debut").toDate().day() == 1) {
        dateDebut = "1er " + french.toString(query.value("date_debut").toDate(), "MMMM yyyy");
    }
    if (query.value("date_fin").toDate().day() == 1) {
        dateFin = "1er " + french.toString(query.value("date_fin").toDate(), "MMMM yyyy");
    }

    // Code HTML pour le titre de congé administratif
    QString titreConge = R"(
        <html>
            <head>
                <style>
                    body { font-family: 'Times New Roman', serif; font-size: 22px; line-height: 1.6; margin: 40px; }
                    h1 { font-size: 36px; font-weight: bold; line-height: 1.0; text-decoration: underline; text-align: center; }
                    .separator { text-align: center; font-size: 24px; font-weight: bold; margin-top: 10px; margin-bottom: 10px; }
                    table { width: 100%; margin-top: 20px; border-collapse: collapse; }
                    th, td { padding: 8px 12px; text-align: left; font-size: 22px; border: 1px solid black; }
                    th { width: 50%; text-align: left; }
                    td { font-weight: bold; }
                    .signataire { margin-top: 20px; padding-top: 40px; }
                </style>
            </head>
            <body>
                <h1>SERVICE DES RESSOURCES HUMAINES ET DES APPROVISIONNEMENTS</h1>
                <p class="separator">--</p>
                <h1>TITRE DE CONGE ADMINISTRATIF</h1>
                <p class="separator">--</p>
                <table>
                    <tr>
                        <th>NOM ET PRENOM DE L'AGENT :</th>
                        <td><strong>)" + query.value("prenom").toString() + " " + query.value("nom").toString() + R"(</strong></td>
                    </tr>
                    <tr>
                        <th>POSTE OCCUPE :</th>
                        <td><strong>)" + query.value("poste").toString() + R"(</strong></td>
                    </tr>
                    <tr>
                        <th>PERIODE DE CONGES :</th>
                        <td>Du <strong>)" + dateDebut + R"(</strong> au <strong>)" + dateFin + R"(</strong></td>
                    </tr>
                    <tr>
                        <th>DATE DE REPRISE :</th>
                        <td><strong>)" + dateReprise + R"(</strong></td>
                    </tr>
                    <tr>
                        <th>INTERIMAIRE :</th>
                        <td></td>
                    </tr>
                    <tr>
                        <th>VISA DE LA DIRECTION EXECUTIVE :</th>
                        <td> <p>Le Directeur Exécutif</p><br>

                             <p>Dr Salomon BALOGOUN</p>
                        </td>
                    </tr>
                </table>

            </body>
        </html>
    )";

    QPrinter printer;
    QPrintPreviewDialog previewDialog(&printer, this);
    connect(&previewDialog, &QPrintPreviewDialog::paintRequested, [&](QPrinter *printer) {
        QTextDocument doc;
        doc.setHtml(titreConge);
        doc.print(printer);
    });
    previewDialog.showMaximized();
    previewDialog.exec();
}



void demandeAbsence::effacer()
{
    ui->numeroDemandeLabel->clear();
    ui->commentaireTextEdit->clear();

    ui->dateTimeDebutEdit->setDate(QDate::currentDate());
    ui->dateTimeFinEdit->setDate(QDate::currentDate());

    ui->joursDemandeSpinBox->setValue(0);

    ui->motifComboBox->setCurrentIndex(-1);

    ui->congeRadioButton->setAutoExclusive(false);
    ui->congeRadioButton->setChecked(false);
    ui->absencerRadioButton->setChecked(false);
    ui->congeRadioButton->setAutoExclusive(true);
}

void demandeAbsence::on_annulerPushButton_clicked()
{
    effacer();
}

void demandeAbsence::on_imprimerPushButton_clicked()
{
    QSqlQuery query;
    if (!query.exec("SELECT ab.id, ab.type_demande, ab.type_conge, ab.motif_absence, ab.date_debut, "
                    "ab.date_fin, ab.jours_demandes, ab.statut, ab.approbateur, "
                    "ab.date_soumission, ag.matricule, ag.nom, ag.prenom, ag.poste, ag.departement "
                    "FROM agents ag JOIN absences ab ON ag.matricule = ab.matricule "
                    "WHERE ab.id =" + QString::number(ui->numeroDemandeLabel->text().toInt())))
    {
        QMessageBox::information(this, "", "Échec de l'exécution de la requête");
        return;
    }

    QString numero, typeDemande, typeConge, motifAbsence, joursDemande, statut, approbateur;
    QString matricule, nom, prenom, poste, programme;
    QDateTime dateDebut, dateFin, dateSoumission;

    if (query.next()) {
        numero = query.value(0).toString();
        typeDemande = query.value(1).toString();
        typeConge = query.value(2).toString();
        motifAbsence = query.value(3).toString();
        dateDebut = query.value(4).toDateTime();
        dateFin = query.value(5).toDateTime();
        joursDemande = query.value(6).toString();
        statut = query.value(7).toString();
        approbateur = query.value(8).toString();
        dateSoumission = query.value(9).toDateTime();
        matricule = query.value(10).toString();
        nom = query.value(11).toString();
        prenom = query.value(12).toString();
        poste = query.value(13).toString();
        programme = query.value(14).toString();
    }

    QString nomPrenom = nom + " " + prenom;
    QLocale french(QLocale::French, QLocale::France);
    QString dateDebutStr = dateDebut.isValid() ? french.toString(dateDebut, "dd MMMM yyyy") : " - ";
    QString dateFinStr = dateFin.isValid() ? french.toString(dateFin, "dd MMMM yyyy") : " - ";
    QString dateSoumissionStr = dateSoumission.isValid() ? french.toString(dateSoumission, "dd MMMM yyyy") : " - ";
    QString dateCourante = french.toString(QDate::currentDate(), "dd MMMM yyyy");

    if (QDate::currentDate().day() == 1) {
        dateCourante = "1er " + french.toString(QDate::currentDate(), "MMMM yyyy");
    }

    text = new QTextEdit;
    QString texte;

    texte += "<!DOCTYPE html><html>"
             "<head>"
             "<style>"
             "body { font-family: 'Times New Roman', serif; font-size: 18px; line-height: 1.2; margin: 20px; }"
             "h1 { text-align: center; font-size: 18px; margin-bottom: 18px; }"
             "h2 { font-size: 17px;} "
             ".section { margin-top: 18px; }"
             "table { width: 100%; border-collapse: collapse; }"
             "td { padding: 8px 10px; font-size: 16px; }"
             ".signatures-table { width: 100%; font-size: 16px;} "
             "</style>"
             "</head>"
             "<body>";

    texte += "<header>"
             "<h1>FICHE DE DEMANDE DE CONGÉS ET ABSENCES</h1>"
             "<p style='text-align: right;'>Date : " + dateCourante + "</p>"
                              "</header>";

    texte += "<div class='section'>"
             "<h2>I - IDENTIFICATION DE L’EMPLOYÉ</h2>"
             "<table>"
             "<tr><td><b>NOM ET PRÉNOM :</b></td><td>" + (nomPrenom.isEmpty() ? " - " : nomPrenom) + "</td></tr>"
                                                           "<tr><td><b>POSTE :</b></td><td>" + (poste.isEmpty() ? " - " : poste) + "</td></tr>"
                                                   "<tr><td><b>PROGRAMME :</b></td><td>" + (programme.isEmpty() ? " - " : programme) + "</td></tr>"
                                                           "</table>"
                                                           "</div>";

    QString jourDipo = " - ";
    QString joursRestants = " - ";
    joursDisponibles = calculerJoursCongesDisponibles(ui->matricule_comboBox->currentText());

    if (typeDemande == "conge") {
        jourDipo = QString::number(joursDisponibles);
        joursRestants = QString::number(joursDisponibles - joursDemande.toDouble());
    }

    texte += "<div class='section'>"
             "<h2>II - CONGÉS</h2>"
             "<table>"
             "<tr><td><b>NOMBRE DE JOURS DE CONGÉ(S) DISPONIBLES :</b></td><td>" + jourDipo + "</td></tr>"
                          "<tr><td><b>NOMBRE DE JOURS DE CONGÉ(S) DEMANDÉ(S) :</b></td><td>" + (joursDemande.isEmpty() ? " - " : joursDemande) + "</td></tr>"
                                                                 "<tr><td><b>NOMBRE DE JOUR(S) RESTANT :</b></td><td>" + joursRestants + "</td></tr>"
                               "<tr><td><b>PÉRIODE DE CONGÉS SOLLICITÉE :</b></td><td>" + dateDebutStr + " au " + dateFinStr + "</td></tr>"
                                                    "</table>"
                                                    "</div>";

    texte += "<div class='section'>"
             "<h2>III - ABSENCES</h2>"
             "<table>"
             "<tr><td><b>NOMBRE DE JOUR(S) SOLLICITÉ(S) :</b></td><td>" + (joursDemande.isEmpty() ? " - " : joursDemande) + "</td></tr>"
                                                                 "<tr><td><b>PÉRIODE D’ABSENCE SOLLICITÉE :</b></td><td>" + dateDebutStr + " au " + dateFinStr + "</td></tr>"
                                                    "<tr><td><b>MOTIF DE L’ABSENCE :</b></td><td>" + (motifAbsence.isEmpty() ? " - " : motifAbsence) + "</td></tr>"
                                                                 "</table>"
                                                                 "</div>";

    texte += "<div class='section'>"
             "<h2>IV - INTÉRIMAIRE</h2>"
             "<table>"
             "<tr><td><b>NOM ET PRÉNOMS :</b></td><td>_____________________________</td></tr>"
             "<tr><td><b>POSTE OCCUPÉ :</b></td><td>______________________________</td></tr>"
             "</table>"
             "</div>";

    texte += "<div class='section'>"
             "<h2>V - SIGNATURE</h2>"
             "<table class='signatures-table'>"
             "<tr>"
             "<td><b>Le Responsable Hiérarchique</b><br>"
             "<p>___________________________</p>"
             "</td>"
             "<td><b>GP/CP/Coordonnateur du projet</b><br>"
             "<p>___________________________</p>"
             "</td>"
             "</tr>"
             "<tr>"
             "<td><b>Le GRH</b><br><br>GAWEZI Nourou</td>"
             "<td><b>Le DE</b><br><br> Salomon BALOGOUN</td>"
             "</tr>"
             "</table>"
             "</div>";

    texte += "<div class='section'>"
             "<h2>OBSERVATION :</h2>"
             "<p>_______________________________________________________________________</p>"
             "</div>";

    texte += "</body></html>";

    text->setHtml(texte);

    QPrinter imprimer;
    imprimer.setPageOrientation(QPageLayout::Portrait);
    QPrintPreviewDialog dialog(&imprimer, this);
    connect(&dialog, SIGNAL(paintRequested(QPrinter*)), this, SLOT(print(QPrinter*)));
    dialog.showMaximized();
    dialog.exec();
}


void demandeAbsence::print(QPrinter *printer)
{
    text->print(printer);
}

void demandeAbsence::on_dateTimeDebutEdit_dateChanged(const QDate &date)
{
    QDate debut = ui->dateTimeDebutEdit->date();
    QDate fin = ui->dateTimeFinEdit->date();
    int joursAbsence = debut.daysTo(fin) + 1;
    ui->joursDemandeSpinBox->setValue(joursAbsence);

    QDate dateReprise = fin.addDays(1);
    while (dateReprise.dayOfWeek() == 6 || dateReprise.dayOfWeek() == 7) {
        dateReprise = dateReprise.addDays(1);
    }
    ui->reprise_dateEdit->setDate(dateReprise);
}

void demandeAbsence::on_dateTimeFinEdit_dateChanged(const QDate &date)
{
    QDate debut = ui->dateTimeDebutEdit->date();
    QDate fin = ui->dateTimeFinEdit->date();
    int joursAbsence = debut.daysTo(fin) + 1;
    ui->joursDemandeSpinBox->setValue(joursAbsence);

    QDate dateReprise = fin.addDays(1);
    while (dateReprise.dayOfWeek() == 6 || dateReprise.dayOfWeek() == 7) {
        dateReprise = dateReprise.addDays(1);
    }
    ui->reprise_dateEdit->setDate(dateReprise);
}

void demandeAbsence::on_imprimerListePushButton_clicked()
{
    QSqlQuery query;

    if (!query.exec(R"(
        SELECT id, matricule, type_demande, type_conge, motif_absence, date_debut, date_fin,
               jours_demandes, commentaire, statut, approbateur, date_soumission
        FROM absences
    )")) {
        qDebug() << "Erreur de requête SQL: " << query.lastError().text();
        return;
    }

    QDateTime currentDate = QDateTime::currentDateTime();
    QString DateCourante = currentDate.toString("yyyy-MM-dd");

    text = new QTextEdit(this);
    QString texte;

    texte += "<!DOCTYPE html><html>"
             "<head>"
             "<style>"
             "body { font-family: Arial, sans-serif; margin: 20px; }"
             "header { text-align: center; margin-bottom: 20px; }"
             "header h1 { font-size: 24px; margin: 0; }"
             "header p { font-size: 14px; margin: 5px 0; }"
             "table { width: 100%; border-collapse: collapse; margin-top: 20px; }"
             "table, th, td { border: 1px solid black; }"
             "th, td { padding: 8px; text-align: left; }"
             "th { background-color: #f2f2f2; }"
             "footer { text-align: center; margin-top: 30px; font-size: 12px; }"
             "</style>"
             "</head>"
             "<body>";

    texte += "<header>"
             "<h1>Gestion des Ressources Humaines</h1>"
             "<p>Historique des demandes d'absences et de congés</p>"
             "<p>Utilisateur : [Nom de l'utilisateur]</p>"
             "</header>";

    texte += "<main>"
             "<h2>Liste des demandes</h2>"
             "<table>"
             "<thead>"
             "<tr>"
             "<th>Numero</th>"
             "<th>Matricule</th>"
             "<th>Type de demande</th>"
             "<th>Type de congé</th>"
             "<th>Motif</th>"
             "<th>Date de début</th>"
             "<th>Date de fin</th>"
             "<th>Jours demandés</th>"
             "<th>Commentaire</th>"
             "<th>Statut</th>"
             "<th>Approbateur</th>"
             "<th>Date de soumission</th>"
             "</tr>"
             "</thead>"
             "<tbody>";

    while (query.next()) {
        QString id = query.value(0).toString();
        QString matricule = query.value(1).toString();
        QString typeDemande = query.value(2).toString();
        QString typeConge = query.value(3).toString();
        QString motif = query.value(4).toString();
        QString dateDebut = query.value(5).toString();
        QString dateFin = query.value(6).toString();
        QString joursDemandes = query.value(7).toString();
        QString commentaire = query.value(8).toString();
        QString statut = query.value(9).toString();
        QString approbateur = query.value(10).toString();
        QString dateSoumission = query.value(11).toString();

        texte += "<tr>"
                 "<td>" + id + "</td>"
                        "<td>" + matricule + "</td>"
                               "<td>" + typeDemande + "</td>"
                                 "<td>" + typeConge + "</td>"
                               "<td>" + motif + "</td>"
                           "<td>" + dateDebut + "</td>"
                               "<td>" + dateFin + "</td>"
                             "<td>" + joursDemandes + "</td>"
                                   "<td>" + commentaire + "</td>"
                                 "<td>" + statut + "</td>"
                            "<td>" + approbateur + "</td>"
                                 "<td>" + dateSoumission + "</td>"
                                    "</tr>";
    }

    texte += "</tbody></table></main>";

    texte += "<footer>"
             "<p>Imprimé le " + DateCourante + "</p>"
                              "</footer>";

    texte += "</body></html>";

    text->setHtml(texte);

    QPrinter imprimer;
    imprimer.setPageOrientation(QPageLayout::Landscape);

    QPrintPreviewDialog dialog(&imprimer, this);
    connect(&dialog, SIGNAL(paintRequested(QPrinter*)), this, SLOT(printe(QPrinter*)));

    dialog.showMaximized();
    dialog.exec();
}


void demandeAbsence::printe(QPrinter *printer)
{
    text->print(printer);
}
