using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;

// <CompileWithRoslyn />

namespace Main
{
    public class Customizer
    {
        public void DownloadAndDispatchPeppolMessages()
        {
            Globals.MercatorTasksToMain.Log("Instanciation du PeppolBoxHelper");
            using (MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper peppolBoxHelper = new MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper())
            {
                if (peppolBoxHelper.DataTable == null)
                    Globals.MercatorTasksToMain.Log("Erreur lors de l'initialisation du PeppolBoxHelper : " + Api.LastError, isError: true);
                else if (!peppolBoxHelper.Download())
                    Globals.MercatorTasksToMain.Log("Erreur lors de téléchargement des messages : " + Api.LastError, isError: true);
                else
                {
                    Globals.MercatorTasksToMain.Log("Message(s) téléchargé(s) : " + peppolBoxHelper.Messages.Count(m => m.IsNew));
                    int nActions = 0;
                    foreach (MercatorUi.Forms.Other.OtherClasses.PeppolBoxHelper.PeppolMessage message in peppolBoxHelper.Messages.Where(m => m.IsNew && m.IsInvoiceOrCreditNote))
                    {
                        MercatorPeppol.ReceivedDoc.ParseContentRet parsedContent = message.ReceivedDoc.ParseContent(Globals.Langue, MercatorPeppol.ReceivedDoc.ParseContentEnum.WithSupplierName | MercatorPeppol.ReceivedDoc.ParseContentEnum.WithPdf);
                        if (!string.IsNullOrWhiteSpace(parsedContent.Error))
                        {
                            Globals.MercatorTasksToMain.Log(string.Format("Parsing message {0} : {1}", message.Id, parsedContent.Error), isError: true);
                            continue;
                        }

                        string id_actempl = null;
                        // ici on met les tests qui permettent de déterminer en fonction du contenu du message le type d'action du CRM qui doit être utilisée
                        if (...)
                        {
                            id_actempl = ".A-0RFCEXW"; // id_actempl gescom
                        }
                        else if (...)
                        {
                            id_actempl = ".A-KC6V639"; // id_actempl compta
                        }
                        if (id_actempl == null)
                            continue; // ce message n'est pas dispatché

                        using (MercatorUi.Engine.Crm.ActionEngine actionEngine = MercatorUi.Engine.Crm.ActionEngine.InitNew(MercatorUi.Sig._SigEnum._none, null, id_actempl))
                        {
                            if (actionEngine == null)
                            {
                                Globals.MercatorTasksToMain.Log("ActionEngine.InitNew : " + actionEngine.LastError, isError: true);
                                continue;
                            }
                            if (actionEngine.ReadOnly)
                            {
                                Globals.MercatorTasksToMain.Log("ActionEngine.InitNew : engine is ReadOnly!");
                                continue;
                            }
                            actionEngine.ActionsRecord.OBJET = (message.ReceivedDoc.ChangeType == "INVOICE_RECEIVED" ? "Facture" : "Note de crédit") + " Peppol de " + parsedContent.SupplierName;
                            actionEngine.ActionsRecord.ENTRYID = message.Id.ToString();
                            actionEngine.ActionsRecord.MOMENT_2 = message.Moment;
                            actionEngine.ActionsRecord.MOMENT_1 = message.Moment.AddDays(5); // échéance pour l'action portée à 5 jours

                            if (!actionEngine.Save())
                            {
                                Globals.MercatorTasksToMain.Log(string.Format("Message {0} : erreur lors de la sauvegarde de l'action : {1}", message.Id, actionEngine.LastError), isError: true);
                                continue;
                            }
                            else if (parsedContent.Pdf == null)
                            {
                                Globals.MercatorTasksToMain.Log(string.Format("Message {0} : pas de PDF dans le message", message.Id), isError: true);
                            }
                            else
                            {
                                if (!Api.BytesToSqlFile(parsedContent.Pdf, Api.AddBS(actionEngine.SqlFileViewDefaultDirectory) + "PeppolDoc.pdf"))
                                    Globals.MercatorTasksToMain.Log(string.Format("Message {0} : impossible de joindre le PDF à l'action", message.Id), isError: true);
                            }
                               
                            nActions++;
                        }
                    }
                    Globals.MercatorTasksToMain.Log("Action(s) créée(s) : " + nActions);
                }
            }
        }
    }
}