namespace Main
{
    public class Customizer
    {
        public void CheckSuppliers()
        {
            string reqSql = @"select fou.f_id as idfournisseur,lignes_c.journal,lignes_c.piece,(case when lignes_c.tot<0 then -lignes_c.tot else 0 end) as debit,(case when lignes_c.tot>0 then lignes_c.tot else 0 end) as credit,lignes_c.date,case when echeance> '19000101' then lignes_c.echeance else null end as echeance,lignes_c.commentair as info
                                from LIGNES_C
                                inner join FOU on lignes_c.id_fou=fou.f_id
                                where (lignes_c.lettrage <= 0) and (lignes_c.type_ligne >= 0)
                                order by fou.f_id,lignes_c.date"
.UnIndent(8);

            List<BookingDescriptor> bookingDescriptors = Api.Zselect<BookingDescriptor>(Globals.RepData, reqSql);
            if (bookingDescriptors == null)
            {
                Globals.MercatorTasksToMain.Log("Select : " + Api.LastError, isError: true);
                return;
            }
            MercatorAI.FactoryOpenAI factory = new MercatorAI.FactoryOpenAI();
            MercatorAI.Interfaces.IOpenAiChat openAiChat = factory.CreateOpenAiChat("gpt-5", out string error);
            if (!string.IsNullOrEmpty(error))
            {
                Globals.MercatorTasksToMain.Log("Kan de OpenAI-chat niet initialiseren: " + error, isError: true);
                return;
            }
            string prompt = @"Hier is een lijst van openstaande leveranciersposten op dit moment in JSON-formaat.
                Duid eventuele mogelijke anomalieën aan, zoals:
                - niet-afgepunte bewegingen die wel afgepunt zouden kunnen worden (identieke of gelijkaardige bedragen, saldo van meerdere bewegingen is nul of bijna nul, ...),
                - betalingen zonder bijbehorende factuur,
                - facturen zonder betaling, met uitzondering van diegene die nog niet vervallen zijn,
                - andere anomalieën die je opmerkt.
                De betalingen staan in de dagboeken ING en VBDA. ODV is een dagboek voor correctieve diverse boekingen

                JSON:".UnIndent(4) + Api.JsonConvertSerializeObject(bookingDescriptors);

            string htmlResponse;
            try
            {
                htmlResponse = openAiChat.Ask(prompt, systemMessage: "Je bent een expert in boekhoudkundige assistentie.");
            }
            catch (Exception ex)
            {
                Globals.MercatorTasksToMain.Log(ex.Message, isError: true);
                return;
            }
            IneoSmtp.Smtp mail = Globals.MercatorTasksToMain.GetNewStmp();
            mail.Subject = "Analyseer openstaande leveranciersposten";
            mail.Message = htmlResponse;
            mail.ForceHtml = true;
            if (!mail.SendMail())
                Globals.MercatorTasksToMain.Log("Fout bij verzenden van e-mail: " + mail.Error, isError: true);
            else
                Globals.MercatorTasksToMain.Log("E-mail correct verzonden naar " + mail.Recipient);
        }

        public class BookingDescriptor
        {
            public string IdFournisseur { get; set; }
            public string Journal { get; set; }
            public Int64 Piece { get; set; }
            public decimal Debit { get; set; }
            public decimal Credit { get; set; }
            public DateTime Date { get; set; }
            public DateTime? Echeance { get; set; }
            public string Info { get; set; }
        }
    }
}