using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorExtensions;
using MercatorUi;
using MercatorDatabase;
using System.Xml;
using MercatorUi.Forms.Other.OtherClasses;

// <CompileWithRoslyn />

namespace PeppolBox
{
    public class Customizer : MercatorUi.ICustomizers.IPeppolBoxHelperCreated, MercatorUi.ICustomizers.IPeppolBoxHelperClosed
    {
        public void PeppolBoxHelperCreated(PeppolBoxHelper peppolBoxHelper)
        {
            peppolBoxHelper.Downloading += PeppolBoxHelper_Downloading;
            FilterMessages(peppolBoxHelper, peppolBoxHelper.Messages);
        }

        public void PeppolBoxHelperClosed(PeppolBoxHelper peppolBoxHelper)
        {
            peppolBoxHelper.Downloading -= PeppolBoxHelper_Downloading;
        }

        private void PeppolBoxHelper_Downloading(object sender, PeppolBoxHelper.DownloadingEventArgs e)
        {
            PeppolBoxHelper peppolBoxHelper = (PeppolBoxHelper)sender;
            FilterMessages(peppolBoxHelper, e.Messages);
        }

        private void FilterMessages(PeppolBoxHelper peppolBoxHelper, PeppolBoxHelper.PeppolMessagesCollection messages)
        {
            foreach (var message in messages.Where(m => m.IsInvoiceOrCreditNote).ToArray())
            {
                var parsedContent = message.ReceivedDoc.ParseContent(Globals.Langue, MercatorPeppol.ReceivedDoc.ParseContentEnum.WithSupplierName);
                if (!string.IsNullOrEmpty(parsedContent.Error))
                {
                    Dialogs.Stop(string.Format("Impossible de lire le contenu du document reçu {0} : {1}\r\n{2}", message.Moment.ToShortDateShortTimeString(), parsedContent.Error, message.Id));
                    peppolBoxHelper.Messages.Remove(message); // on ne sait pas lire le message. Par sécurité on le supprime.
                    continue;
                }

                if (string.IsNullOrEmpty(parsedContent.SupplierVatNo))
                {
                    Dialogs.Stop(string.Format("Impossible de lire le numéro de TVA du document reçu {0} du fournisseur \"{1}\" !\r\n{2}", message.Moment.ToShortDateShortTimeString(), parsedContent.SupplierName, message.Id));
                    peppolBoxHelper.Messages.Remove(message); // on ne sait pas lire le message. Par sécurité on le supprime.
                    continue;
                }

                List<(string f_cat1, string f_cat2)> fou = Api.Zselect<(string f_cat1, string f_cat2)>(Globals.RepData, "select f_cat1,f_cat2 from FOU where f_num_tva=@num_tva", new MercatorSqlParam("@num_tva", parsedContent.SupplierVatNo, SqlDbType.Char));
                if (fou == null)
                {
                    peppolBoxHelper.Messages.Remove(message); // Erreur SQL. Par sécurité on supprime le message.
                    continue;
                }

                if (!fou.Any())
                {
                    Dialogs.Stop(string.Format("Le fournisseur \"{0}\" avec numéro de TVA {1} n'existe pas !\r\n{2}", parsedContent.SupplierName, parsedContent.SupplierVatNo, message.Id));
                    peppolBoxHelper.Messages.Remove(message); // Le fournisseur n'est pas identifié. Par sécurité on supprime le message.
                    continue;
                }

                if (!string.IsNullOrEmpty(fou[0].f_cat1) && !Globals.CurrentUserRecord.DEPT.Contains(fou[0].f_cat1)
                    || !string.IsNullOrEmpty(fou[0].f_cat2) && !Globals.CurrentUserRecord.DEPT.Contains(fou[0].f_cat2))
                {
                    peppolBoxHelper.Messages.Remove(message); // L'utilisateur ne traite pas les factures de ce fournisseur. On supprime le message.
                }
            }
        }
    }
}