/**
   * change le statut de lecture d'un message
   *
   * @param p_message l'id du message concerné
   * @param p_isLu true si le message est lu, false si le message est non lu
   * @return true si ca a reussi
   */
  private boolean updateStatusLecture(MlMessageGrille p_message, boolean p_isLu) {
    String script;
    if (p_isLu) {
      if (p_message.isLu()) {
        return true; // pas besoin de le refaire
      }
      script =
          "UPDATE "
              + EnTable.MAIL_RECU.getNomTable()
              + " SET STATUT='T' WHERE "
              + EnStructMailRecu.ID_MESSAGE.getNomChamp()
              + "="
              + p_message.getIdMessage();
    } else {
      if (!p_message.isLu()) {
        return true; // pas besoin de le refaire
      }
      script =
          "UPDATE "
              + EnTable.MAIL_RECU.getNomTable()
              + " SET STATUT='F' WHERE "
              + EnStructMailRecu.ID_MESSAGE.getNomChamp()
              + "="
              + p_message.getIdMessage();
    }

    return requeteFact.executeRequete(script);
  }
  /**
   * Deplace une liste de message vers la corbeille
   *
   * @param p_list
   * @return
   */
  public boolean deplaceMessageVersCorbeille(MlListeMessageGrille p_list) {
    MlCompteMail cpt = null;
    if (p_list != null && p_list.size() > 0) {
      cpt = new MlCompteMail(p_list.get(0).getIdCompte());
    }
    for (MlMessageGrille m : p_list) {

      String requete =
          "UPDATE "
              + EnTable.MAIL_RECU.getNomTable()
              + " SET "
              + EnStructMailRecu.ID_DOSSIER.getNomChamp()
              + "="
              + cpt.getIdCorbeille()
              + " WHERE "
              + EnStructMailRecu.ID_MESSAGE.getNomChamp()
              + "="
              + m.getIdMessage();
      boolean succes = requeteFact.executeRequete(requete);
      if (!succes) {
        return false;
      }
    }

    return true; // si tout s'est bien passé ou si la liste etait vide
  }
 public List<ArrayList<String>> getMessageGrilleById(int p_idMessage) {
   String script =
       "SELECT " //
           + EnStructMailRecu.EXPEDITEUR.getNomChamp()
           + ", "
           + //
           EnStructMailRecu.SUJET.getNomChamp()
           + ", "
           + //
           EnStructMailRecu.DATE_RECEPTION.getNomChamp()
           + ", "
           + //
           EnStructMailRecu.STATUT.getNomChamp()
           + ", "
           + //
           EnStructMailRecu.UID.getNomChamp()
           + ", "
           + //
           EnStructMailRecu.ID_COMPTE.getNomChamp()
           + ", "
           + //
           EnStructMailRecu.ID_DOSSIER.getNomChamp() //
           + " FROM "
           + EnTable.MAIL_RECU.getNomTable()
           + //
           " WHERE " //
           + EnStructMailRecu.ID_MESSAGE.getNomChamp()
           + "="
           + p_idMessage;
   List<ArrayList<String>> lstResultat = requeteFact.getListeDenregistrement(script);
   return lstResultat;
 }
  /**
   * Effacer un message (et ses pieces jointes si il y en a) a partir de son ID
   *
   * @param p_idMessage
   * @return
   */
  public boolean deleteMessageRecu(int p_idMessage) {
    // on commence par effacer les piece jointe associées au message.
    AccesTablePieceJointe accesPJ = new AccesTablePieceJointe();
    List<String> lstPieceJointe = accesPJ.getListeIdPieceJointe(p_idMessage);
    for (String pieceJointe : lstPieceJointe) {
      String requete =
          "DELETE FROM "
              + EnTable.PIECE_JOINTE.getNomTable()
              + " WHERE "
              + EnStructPieceJointe.ID.getNomChamp()
              + "='"
              + pieceJointe
              + "'";
      requeteFact.executeRequete(requete);
    }

    // on peut ensuite supprimer les messages
    String requetteMessage =
        "DELETE FROM "
            + EnTable.MAIL_RECU.getNomTable()
            + " WHERE "
            + EnStructMailRecu.ID_MESSAGE.getNomChamp()
            + "="
            + p_idMessage;
    return requeteFact.executeRequete(requetteMessage);
  }
 /**
  * Obtenir le sujet d'un message a partir de son ID
  *
  * @param p_idMessage
  * @return
  */
 public String getSujetFromId(int p_idMessage) {
   String requette =
       "SELECT "
           + EnStructMailRecu.SUJET.getNomChamp()
           + " FROM "
           + EnTable.MAIL_RECU.getNomTable()
           + " WHERE "
           + EnStructMailRecu.ID_MESSAGE.getNomChamp()
           + "="
           + p_idMessage;
   return requeteFact.get1Champ(requette);
 }
 /**
  * Obtenir le contenu d'un message a partir de son ID et le stocke dans un String
  *
  * @param p_idMessage
  * @return
  */
 public String getContenuFromIdForString(int p_idMessage) {
   String requette =
       "SELECT "
           + EnStructMailRecu.CONTENU.getNomChamp()
           + " FROM "
           + EnTable.MAIL_RECU.getNomTable()
           + " WHERE "
           + EnStructMailRecu.ID_MESSAGE.getNomChamp()
           + "="
           + p_idMessage;
   return requeteFact.get1Champ(requette);
 }
  public MlListeMessageGrille getListeMessageGrille(int p_idCompte, int p_idDossierChoisi) {

    MlListeMessageGrille lstMessage = new MlListeMessageGrille();
    String script =
        "SELECT " //
            + EnStructMailRecu.EXPEDITEUR.getNomChamp()
            + ", "
            + EnStructMailRecu.SUJET.getNomChamp()
            + ", "
            + EnStructMailRecu.DATE_RECEPTION.getNomChamp()
            + ", "
            + EnStructMailRecu.STATUT.getNomChamp()
            + ", "
            + EnStructMailRecu.UID.getNomChamp()
            + ", "
            + EnStructMailRecu.ID_MESSAGE.getNomChamp()
            + " FROM "
            + EnTable.MAIL_RECU.getNomTable() //
            + " WHERE " //
            + EnStructMailRecu.ID_DOSSIER.getNomChamp()
            + "="
            + p_idDossierChoisi //
            + " AND " //
            + EnStructMailRecu.ID_COMPTE.getNomChamp()
            + "="
            + p_idCompte //
            + " ORDER BY "
            + EnStructMailRecu.DATE_RECEPTION.getNomChamp()
            + " DESC";

    List<ArrayList<String>> lstResultat = requeteFact.getListeDenregistrement(script);

    for (int i = 0; i < lstResultat.size(); i++) {
      ArrayList<String> aRecord = lstResultat.get(i);

      MlMessageGrille m = new MlMessageGrille();

      m.setExpediteur(decodeHTMLFromBase(aRecord.get(0)));
      m.setSujet(decodeHTMLFromBase(aRecord.get(1)));
      m.setDateReception(RecupDate.getdateFromTimeStamp((aRecord.get(2))));
      m.setLu(statutLecture.T.name().equals(aRecord.get(3)));
      m.setUidMessage(aRecord.get(4));
      m.setIdCompte(p_idCompte);
      m.setIdDossier(p_idDossierChoisi);
      m.setIdMessage(Integer.parseInt(aRecord.get(5)));
      m.setHavePieceJointe(messageHavePieceJointe(m.getIdMessage()));

      lstMessage.add(m);
    }

    return lstMessage;
  }
 /**
  * Met a jour l'UID d'un message (lors du deplacement d'un message d'un dossier vers un autre
  * (Serveur IMAP par exemple)
  *
  * @param p_mlMessageGrille
  * @return
  */
 public boolean updateUIDMessage(MlMessageGrille p_mlMessageGrille) {
   String requete =
       "UPDATE "
           + EnTable.MAIL_RECU.getNomTable()
           + " SET "
           + EnStructMailRecu.UID.getNomChamp()
           + "='"
           + p_mlMessageGrille.getUidMessage()
           + "' WHERE "
           + EnStructMailRecu.ID_MESSAGE.getNomChamp()
           + "="
           + p_mlMessageGrille.getIdMessage();
   return requeteFact.executeRequete(requete);
 }
 /**
  * Savoir si un message est lu a partr de son ID
  *
  * @param p_idMessageRecu
  * @return
  */
 public boolean isMessageLu(int p_idMessageRecu) {
   String script =
       "SELECT "
           + EnStructMailRecu.STATUT.getNomChamp()
           + " FROM "
           + EnTable.MAIL_RECU.getNomTable()
           + " where "
           + EnStructMailRecu.ID_MESSAGE.getNomChamp()
           + "="
           + p_idMessageRecu;
   if ("T".equals(requeteFact.get1Champ(script))) {
     return true;
   }
   return false;
 }
 /**
  * Obtenir le nombre de message dans un dossier
  *
  * @param p_idCompte
  * @param p_idDossier
  * @return
  */
 public int getnbMessageParDossier(int p_idCompte, int p_idDossier) {
   String requette =
       "select count ("
           + EnStructMailRecu.UID.getNomChamp()
           + ") FROM "
           + EnTable.MAIL_RECU.getNomTable()
           + " where "
           + EnStructMailRecu.ID_COMPTE.getNomChamp()
           + "="
           + p_idCompte
           + " and "
           + EnStructMailRecu.ID_DOSSIER.getNomChamp()
           + "="
           + p_idDossier;
   return Integer.parseInt(requeteFact.get1Champ(requette));
 }
 /**
  * savoir si l'uid est connu de la base
  *
  * @param uid - l'UID du message que l'on est en train de relever
  * @param p_idDossier - l'id du dossier dans lequel on fait la recherche
  * @return true si le message n'est pas present, false si le message est deja en base
  */
 public boolean isMessageUIDAbsent(String uid, int p_idDossier) {
   if (null == uid) {
     return true; // le message N'EST PAS EN BASE
   }
   String requete =
       "SELECT count (*) from "
           + EnTable.MAIL_RECU.getNomTable()
           + " where "
           + EnStructMailRecu.UID.getNomChamp()
           + "='"
           + uid.trim()
           + "' and "
           + EnStructMailRecu.ID_DOSSIER.getNomChamp()
           + "="
           + p_idDossier;
   return ("0".equals(requeteFact.get1Champ(requete)));
 }
  /**
   * Obtenir le contenu d'un message a partir de son id et le stocke dans un File
   *
   * @param p_idMessage
   * @param p_pleinecran
   * @return le contenu sous forme de File
   */
  public File getContenuFromIdForFile(int p_idMessage, boolean p_pleinecran) {
    String requette =
        "SELECT "
            + EnStructMailRecu.CONTENU.getNomChamp()
            + " FROM "
            + EnTable.MAIL_RECU.getNomTable()
            + " WHERE "
            + EnStructMailRecu.ID_MESSAGE.getNomChamp()
            + "="
            + p_idMessage;
    File contenuHTML;
    if (p_pleinecran) {
      contenuHTML = new File(GestionRepertoire.RecupRepTravail() + "/tempo/contenu_p.html");
    } else {
      contenuHTML = new File(GestionRepertoire.RecupRepTravail() + "/tempo/contenu.html");
    }
    if (contenuHTML.exists()) {
      contenuHTML.delete();
    }

    contenuHTML.deleteOnExit();

    return requeteFact.writeBlobToFile(requette, contenuHTML);
  }
  /**
   * Enregistre un message dans la base
   *
   * @param m
   */
  public void createNewMessage(MlMessage m) {
    int idCompte = m.getIdCompte();
    int idDossierStockage = m.getIdDossier();
    String uidMessage = m.getUIDMessage();
    String expediteur = encodeHTMLforBase(m.getExpediteur());
    List<String> listeDestinataire = m.getDestinataire();
    List<String> listCopy = m.getDestinataireCopy();
    List<String> listCachee = m.getDestinataireCache();

    File fileToBlobDestinataires = createBlobFileFromlist(listeDestinataire, "destinataire");
    File fileToBlobDestCopy = createBlobFileFromlist(listCopy, "dest_copy");
    File fileToBlobDestHide = createBlobFileFromlist(listCachee, "hide_dest");

    String sujet = encodeHTMLforBase(m.getSujet());
    String contenu = m.getContenu();
    File fileToBlobContenu = createFileForBlob(contenu, "contenu");

    String dateReception = RecupDate.getTimeStamp(m.getDateReception());

    int tailleStringBuilder =
        uidMessage.length()
            + expediteur.length()
            /* + destinataires.length() */ + sujet.length()
            + 500;
    // on construit la requette
    StringBuilder requette = new StringBuilder(tailleStringBuilder);
    requette.ensureCapacity(tailleStringBuilder);
    requette.append("INSERT INTO " + EnTable.MAIL_RECU.getNomTable()); //
    requette.append("("); //
    requette.append(EnStructMailRecu.ID_COMPTE.getNomChamp() + ","); //
    requette.append(EnStructMailRecu.ID_DOSSIER.getNomChamp() + ","); //
    requette.append(EnStructMailRecu.UID.getNomChamp() + ","); //
    requette.append(EnStructMailRecu.EXPEDITEUR.getNomChamp() + ","); //
    requette.append(EnStructMailRecu.DEST.getNomChamp() + ","); //
    requette.append(EnStructMailRecu.DEST_COPY.getNomChamp() + ","); //
    requette.append(EnStructMailRecu.DEST_CACHE.getNomChamp() + ","); //
    requette.append(EnStructMailRecu.SUJET.getNomChamp() + ","); //
    requette.append(EnStructMailRecu.CONTENU.getNomChamp() + ","); //
    requette.append(EnStructMailRecu.DATE_RECEPTION.getNomChamp() + ","); //
    requette.append(EnStructMailRecu.STATUT.getNomChamp() + ")"); //
    requette.append("VALUES ("); //
    requette.append(idCompte + ","); //
    requette.append(idDossierStockage + ",'"); //
    requette.append(uidMessage + "','"); //
    requette.append(expediteur + "',"); //
    requette.append("?,"); // lstDest
    requette.append("?,"); // lstDestCC
    requette.append("?,'"); // lstDestBCC
    requette.append(sujet + "',");
    requette.append("?,'"); // c'est pour le contenu qui sera stocké dans un
    // blob
    requette.append(dateReception + "',"); //
    if (m.isLu()) {
      requette.append("'T')");
    } else {
      requette.append("'F')");
    }

    // le status de lecture du message (F= nonlu,T=lu)

    // on l'execute

    boolean succes =
        requeteFact.executeRequeteWithBlob(
            requette.toString(),
            fileToBlobContenu,
            fileToBlobDestinataires,
            fileToBlobDestCopy,
            fileToBlobDestHide);
    if (succes) {

      // on recupere le nouvel id du message que l'on vient d'enregistrer
      String getMaxId =
          "SELECT max ("
              + EnStructMailRecu.ID_MESSAGE.getNomChamp()
              + ") FROM "
              + EnTable.MAIL_RECU.getNomTable();
      String maxId = requeteFact.get1Champ(getMaxId);
      // ("l'id de message que l'on vient d'enregistrer est: "
      // + maxId);

      // lst.add();

      // updateStatusLecture(lst, false);

      JTreeFactory treeFact = new JTreeFactory();
      MlListeMessageGrille lst = new MlListeMessageGrille();
      lst.add(new MlMessageGrille(Integer.parseInt(maxId)));
      treeFact.majUnreadCount(lst);

      verifEtSuppressionBlob(new File(m.getCheminPhysique()));
      verifEtSuppressionBlob(fileToBlobContenu);
      verifEtSuppressionBlob(fileToBlobDestinataires);
      verifEtSuppressionBlob(fileToBlobDestCopy);
      verifEtSuppressionBlob(fileToBlobDestHide);

      // on insere le contenu en base
      // si des pieces jointe sont presente, on enregistre leur chemin en
      // base avec l'id du message
      for (File f1 : m.getListePieceJointe()) {
        if (requeteFact.enregistrePieceJointe(maxId, f1)) {
          f1.delete();
        }
      }
    }
  }
  /**
   * Obtenir une liste des messages contenu dans un {@link MlDossier}
   *
   * @param p_idCompte
   * @param p_idDossierChoisi
   * @return la lsite des messages
   */
  public MlListeMessage getListeDeMessage(int p_idCompte, int p_idDossierChoisi) {
    AccesTablePieceJointe accesPJ = new AccesTablePieceJointe();
    MlListeMessage lstMessage = new MlListeMessage();
    String requette =
        "SELECT " //
            + EnStructMailRecu.ID_MESSAGE.getNomChamp()
            + ", " // idx0
            + EnStructMailRecu.UID.getNomChamp()
            + ", " // idx1
            + EnStructMailRecu.EXPEDITEUR.getNomChamp()
            + ", " // idx2
            + EnStructMailRecu.DEST.getNomChamp()
            + ", "
            + EnStructMailRecu.DEST_COPY.getNomChamp()
            + ", "
            + EnStructMailRecu.DEST_CACHE.getNomChamp()
            + ", " // idx
            // 3,4,5
            + EnStructMailRecu.SUJET.getNomChamp()
            + ", " // idx6
            // + EnStructMailRecu.CONTENU.getNomChamp()
            // + ", " // idx7
            + EnStructMailRecu.DATE_RECEPTION.getNomChamp() // idx8
            + ", "
            + EnStructMailRecu.STATUT.getNomChamp()
            + " FROM "
            + EnTable.MAIL_RECU.getNomTable() //
            + " where "
            + EnStructMailRecu.ID_COMPTE.getNomChamp()
            + "="
            + p_idCompte
            + " and "
            + EnStructMailRecu.ID_DOSSIER.getNomChamp()
            + "="
            + p_idDossierChoisi
            + " ORDER BY "
            + EnStructMailRecu.DATE_RECEPTION.getNomChamp()
            + " DESC";
    List<ArrayList<String>> lstResultat = requeteFact.getListeDenregistrement(requette);
    for (int i = 0; i < lstResultat.size(); i++) {
      ArrayList<String> unEnregistrement = lstResultat.get(i);
      MlMessage m = new MlMessage();
      m.setIdMessage(Integer.parseInt(unEnregistrement.get(0)));
      m.setUIDMessage(unEnregistrement.get(1));
      m.setExpediteur(decodeHTMLFromBase(unEnregistrement.get(2)));

      if (unEnregistrement.get(3) != null) { // DESTINATAIRE
        String[] tabDestinaire = unEnregistrement.get(3).split(";");
        ArrayList<String> lstDest = new ArrayList<String>();
        for (String des : tabDestinaire) {
          lstDest.add(des);
        }
        m.setDestinataire(lstDest);
      }
      if (unEnregistrement.get(4) != null) { // DESTINATAIRE COPY
        String[] tabDestinaire = unEnregistrement.get(4).split(";");
        ArrayList<String> lstDest = new ArrayList<String>();
        for (String des : tabDestinaire) {
          lstDest.add(des);
        }
        m.setDestinataireCopy(lstDest);
      }
      if (unEnregistrement.get(5) != null) { // DESTINATAIRE CACHE
        String[] tabDestinaire = unEnregistrement.get(5).split(";");
        ArrayList<String> lstDest = new ArrayList<String>();
        for (String des : tabDestinaire) {
          lstDest.add(des);
        }
        m.setDestinataireCache(lstDest);
      }

      m.setSujet(decodeHTMLFromBase(unEnregistrement.get(6)));
      // m.setContenu(unEnregistrement.get(7));
      m.setDateReception(RecupDate.getdateFromTimeStamp((unEnregistrement.get(7))));
      m.setLu((unEnregistrement.get(8).equals("T")));
      m.setIdDossier(p_idDossierChoisi);
      m.setIdCompte(p_idCompte);

      m.setHavePieceJointe(accesPJ.getListeIdPieceJointe(m.getIdMessage()).size() > 0);

      lstMessage.add(m);
    }

    return lstMessage;
    // return null;
  }