public static async Task <ResultViewModel> SaveAndSendNewMessage(SendMessageViewModel model, ServiceGateWayClient gatewayITask, TaskUser user, EnvironmentViewModel environment, List <JoinFileViewModel> newFiles)
        {
            var newFilesTojoin     = MapClJoinFileToJoinFileViewModel.Map(newFiles);
            var existingFilesToAdd = await Task.Run(() => gatewayITask.GetJoinFilesByPermId(model.ExistingFilesToJoin.ToArray()));

            var files = newFilesTojoin.ToList();

            foreach (var existing in existingFilesToAdd)
            {
                var f = existing;
                f.PermIdFileAlreadyArchived = f.PermId;
                files.Add(f);
            }

            var cltaskdocument = new ClTaskDocument
            {
                Task = new ClTask
                {
                    TechnicalId    = model.TaskId,
                    Description    = model.TaskDescription,
                    EmployerNumber = model.EmployerNumber,
                    WorkerNumber   = model.WorkerNumber
                }
            };

            var result = new ResultViewModel
            {
                NoError = true
            };
            //bool isOk = true;
            var task = await Task.Run(() => gatewayITask.SearchDocumentTask(model.TaskId, user.Language, true, MapClRessourcesToRessourcesViewModel.Map(user.RessourcesListWithAccess).ToArray(), long.Parse(user.Id)));

            task.CurrentStatus = model.Status;
            if (task.CurrentStatus != 4)
            {
                task.Task.EffectiveEndDate = DateTime.MinValue;
            }
            switch (model.TypeOfMessage)
            {
            case 1:     //Mail provenant de l'extérieur --> on n'enverra pas de mail de ce type
                break;

            case 2:     // commentaire
                Log.Write("SaveAndSendNewMessage", "Conversation", model.TaskId.ToString(), 3, "debut SaveComment");
                result.NoError = await SaveComment(gatewayITask, user, cltaskdocument, files, model);

                Log.Write("SaveAndSendNewMessage", "Conversation", model.TaskId.ToString(), 3, "fin SaveComment");
                if (result.NoError)
                {
                    result.NoError = await Task.Run(() => gatewayITask.UpdateTaskDocument(task, user.Id, user.CurrentEntityNumber, MapClRessourcesToRessourcesViewModel.Map(user.RessourcesListWithAccess).ToArray(), long.Parse(user.Id)));
                }
                break;

            case 3:     //Mail interne
                result.NoError = await SaveInternMessage(gatewayITask, user, cltaskdocument, files, model);

                if (model.AssignToUser)
                {
                    task.Context = int.Parse(model.InternRecipientId);
                }
                if (result.NoError)
                {
                    result.NoError = await Task.Run(() => gatewayITask.UpdateTaskDocument(task, user.Id, user.CurrentEntityNumber, MapClRessourcesToRessourcesViewModel.Map(user.RessourcesListWithAccess).ToArray(), long.Parse(user.Id)));
                }
                break;

            case 8:
            case 10:     //Mail destiné à l'extérieur
                var filesForEmail = GetFilesForEmail(existingFilesToAdd, newFilesTojoin);
                result = await SaveExternMessage(gatewayITask, user, cltaskdocument, files, filesForEmail, model);

                if (result.NoError && !model.IsDirectEmail)
                {
                    result.NoError = await Task.Run(() => gatewayITask.UpdateTaskDocument(task, user.Id, user.CurrentEntityNumber, MapClRessourcesToRessourcesViewModel.Map(user.RessourcesListWithAccess).ToArray(), long.Parse(user.Id)));
                }
                break;
            }
            return(result);
        }
        public static async Task <ConversationViewModel> FillConversationFromTask(long taskId, ServiceGateWayClient gatewayITask, EnvironmentViewModel environnement, TaskUser user, List <ClAgent> fullAgents, ClTaskDocument currentTask = null)
        {
            var model = new ConversationViewModel();
            var task  = new ClTaskDocument();

            //On va chercher les préférences utilisateurs, comme l'affichage chronologique, les couleurs...
            var userPreference = await PreferenceHelper.GetPreferenceSettings(gatewayITask, user);

            //pour pouvoir avoir les quelques infos de la tâche (description, employeur et travailleur de la tâche)
            if (currentTask != null)
            {
                task = currentTask;
            }
            else
            {
                //on va récupérer les documents attachés à la tâche
                task = await Task.Run(() => gatewayITask.SearchDocumentTask(taskId, environnement.language, true,
                                                                            MapClRessourcesToRessourcesViewModel.Map(user.RessourcesListWithAccess).ToArray(), long.Parse(user.Id)));
            }

            //On va cherché les éléments de conversations liés à la tâche et on les trie par date d'envoi
            var contentConversation = gatewayITask.GetTaskConversation(task).OrderBy(a => a.SentDate);


            if (taskId == -1)
            {
                //Actuellement aucunes tâches sans identifiant...une sécurité inutile?
                //todo something
            }
            else
            {
                model.TaskId              = taskId;
                model.CurrentStatus       = task.CurrentStatus;
                model.Description         = task.Task.Description;
                model.TaskEmployerNumber  = task.Task.EmployerNumber;
                model.TaskEmployerName    = task.Task.EmployerDenomination;
                model.TaskWorkerNumber    = task.Task.WorkerNumber;
                model.TaskWorkerName      = task.Task.WorkerName;
                model.DialogDisplayChrono = userPreference.DialogDisplayChrono;
                model.IsStatusVisible     = true;

                //on construit la conversation
                foreach (var elem in contentConversation)
                {
                    //Filtre en fonction des droits de l'utilisateur connecté
                    if (CanSeeMessage(elem, user, gatewayITask))
                    {
                        var senderMail = CreateALiasFormated(elem.AuthorAgent.Mail, elem.AliasFrom);
                        var mess       = new MessageConversationViewModel
                        {
                            TypeOfMessage             = elem.ContributionType.ToString(),
                            DateOfMessage             = elem.SentDate,
                            Sender                    = senderMail,
                            Subject                   = elem.Subject,
                            MessageContentText        = elem.MailBodyText,
                            MessageContentHtml        = elem.MailBody,
                            IsConfidential            = elem.Confidential == 1,
                            FilesAssociatedToMessage  = new List <DocumentViewModel>(),
                            FullHtmlToRecover         = "<div style=\"color:black;\">" + elem.MailBody + "</div>",
                            PermIdMainMessage         = elem.PermIdMainMessage,
                            TechnicalIdContributeTask = elem.IdTechnic,
                            MailBodyIsHtml            = elem.MailBodyIsHtml,
                            AliasCopyCc               = new List <string>(elem.AliasCopyCc),
                            AliasRecipient            = new List <string>(elem.AliasRecipient),
                            AliasFrom                 = elem.AliasFrom
                        };

                        // 10/09/2019, toujours prendre le contenu html du mail
                        if (string.IsNullOrEmpty(mess.MessageContentHtml))
                        {
                            mess.MessageContentHtml = mess.MessageContentText;
                        }

                        // Lors de l'envoi du mail, le tag GroupSMailExternTask a été rajouté
                        // Donc on peut couper pour l'affichage tout ce qui se trouve dans cette Div
                        try
                        {
                            //Nugget pour parcourir HTML sous forme hierarchique
                            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
                            doc.LoadHtml(mess.MessageContentHtml);
                            var divs = doc.DocumentNode.SelectNodes("//div");
                            if (divs != null)
                            {
                                foreach (var tag in divs)
                                {
                                    if (tag.Attributes["id"] != null && tag.Attributes["id"].Value.Contains("MailExternTask"))
                                    {
                                        tag.Remove();
                                    }
                                }
                                mess.MessageContentHtml = doc.DocumentNode.InnerHtml;
                            }
                        }
                        catch { }
                        //

                        mess.AgentVm = MapClAgentToAgentViewModel.Map(elem.AuthorAgent);

                        //on construit les CC
                        foreach (var cc in elem.CopyCc)
                        {
                            if (cc != "0")
                            {
                                mess.CopyTo += cc + ", ";
                            }
                        }


                        if (!string.IsNullOrEmpty(mess.CopyTo))
                        {
                            mess.CopyTo = mess.CopyTo.Substring(0, mess.CopyTo.Length);
                        }

                        foreach (var rc in elem.Recipient)
                        {
                            if (rc != "0")
                            {
                                mess.Receiver += rc + ", ";
                            }
                        }

                        if (!string.IsNullOrEmpty(mess.Receiver))
                        {
                            mess.Receiver = mess.Receiver.Substring(0, mess.Receiver.Length);
                        }

                        //Permet de savoir si il y a plus d'une seule addresse dans le to
                        var isManyReceiver = mess.Receiver != null?mess.Receiver.Split(',') : new string [1];

                        List <string> listReceiver = new List <string>(isManyReceiver);

                        //Supprime la derniere cellule car elle est egale a " " comme on split sur les ','
                        listReceiver.RemoveAt(listReceiver.Count() - 1);

                        //savoir si on doit afficher le bouton reply all ou pas
                        mess.CanSeeReplyAllButton = listReceiver.Count() > 1 || mess.CopyTo != null ? true : false;

                        //si ce n'est pas un commentaire
                        if (mess.TypeOfMessage != "2")
                        {
                            var adrTo = CreateChainOfAddressMailWithAlias(elem.AliasRecipient, elem.Recipient);
                            if (adrTo.Length > 0)
                            {
                                //Retire la derniere virgule inutile
                                adrTo = adrTo.Remove(adrTo.Length - 1);
                                mess.MoreInfosAboutMessage = "TO : " + adrTo;
                            }

                            var adrCC = CreateChainOfAddressMailWithAlias(elem.AliasCopyCc, elem.CopyCc);
                            if (adrCC.Length > 0)
                            {
                                //Retire la derniere virgule inutile
                                adrCC = adrCC.Remove(adrCC.Length - 1);
                                mess.MoreInfosAboutMessage += ",CC : " + adrCC;
                            }


                            // Il arrive que des mails ont été archivés sans adresses dans To et sans CC
                            if (mess.MoreInfosAboutMessage != null)
                            {
                                mess.MoreInfosAboutMessage = mess.MoreInfosAboutMessage.Replace(";", ";\n");
                            }
                        }

                        foreach (var file in elem.joinFiles)
                        {
                            mess.FilesAssociatedToMessage.Add(new DocumentViewModel
                            {
                                DocumentName = file.FileName,
                                PermId       = file.PermId
                            });
                        }

                        //Adaptation pour le CSS sous forme de bulle de conversation => preferences
                        switch (elem.ContributionType)
                        {
                        case 1:    //TASK_TYPE_CONTRIBUTION 1 Mail provenant de l'extérieur
                            mess.BubbleCss = "bubble-left mail-content";
                            break;

                        case 2:    //TASK_TYPE_CONTRIBUTION 2 Commentaire
                            mess.BubbleCss = "bubble-comment comment-content";
                            break;

                        case 3:    //TASK_TYPE_CONTRIBUTION 3 Mail interne
                                   //si c'est message interne mais c'est la réponse d'un collègue --> bubble-left-internal
                            mess.BubbleCss = elem.AuthorCreation == user.Id ? "bubble-right-internal dialog-content" : "bubble-left-internal dialog-content";
                            break;

                        case 8:    //TASK_TYPE_CONTRIBUTION 10 Mail destiné à l'extérieur
                            mess.BubbleCss = elem.AuthorCreation == user.Id ? "bubble-right-draft mail-content" : "bubble-left-draft mail-content";
                            break;

                        case 10:    //TASK_TYPE_CONTRIBUTION 10 Mail destiné à l'extérieur
                            mess.BubbleCss = elem.AuthorCreation == user.Id ? "bubble-right-external mail-content" : "bubble-left-external mail-content";
                            break;
                        }
                        model.MessageConversationList.Add(mess);
                    }
                }

                //mettre le dernier mail externe en reply si il existe
                var lastExt = model.MessageConversationList.LastOrDefault(x => x.TypeOfMessage == "1");
                if (lastExt != null)
                {
                    lastExt.LastExternReply = true;
                }

                //mettre le dernier mail interne en reply si il existe
                var lastInt = model.MessageConversationList.LastOrDefault(x => x.TypeOfMessage == "3");
                if (lastInt != null)
                {
                    lastInt.LastInternReply = true;
                }
            }

            model.Environment = new EnvironmentViewModel
            {
                _listLabels = environnement._listLabels,
                language    = environnement.language
            };


            if (userPreference.DialogDisplayChrono)
            {
                model.MessageConversationList = model.MessageConversationList.OrderBy(a => a.DateOfMessage).ToList();
            }
            else
            {
                model.MessageConversationList = model.MessageConversationList.OrderByDescending(a => a.DateOfMessage).ToList();
            }

            return(model);
        }