using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using MercatorApi;
using MercatorController;
using System.Windows.Forms;
using MercatorExtensions;
using MercatorDatabase;

// <CompileWithRoslyn />

namespace MercatorUi.MovableControls.ButtonsCodes
{
    public static class Script
    {

        public static void Exec(MercatorUi.MovableControls.MovableButton clickedButton)
        {
            // enter your customized code here
            MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)clickedButton.Form;
            if (string.IsNullOrWhiteSpace(sigForm.StockRecord.S_MODELE))
            {
                MercatorUi.Dialogs.Stop("La désignation en français est vide !");
                return;
            }
            MercatorAI.FactoryOpenAI factory = new MercatorAI.FactoryOpenAI();
            MercatorAI.Interfaces.IOpenAiChat openAiChat = factory.CreateOpenAiChat("gpt-4o-mini", out string error);
            if (!string.IsNullOrEmpty(error))
            {
                MercatorUi.Dialogs.Stop("Impossible d'initialiser le chat d'OpenAI : " + error);
                return;
            }
            string systemMessage = "Tu es un assistant que traduit en néerlandais, anglais et allemand des noms de produits dans un magasin de bricolage.";
            string chatMessage = sigForm.StockRecord.S_MODELE;
            MercatorAI.FactoryOpenAI.ChatOptions chatOptions = new MercatorAI.FactoryOpenAI.ChatOptions
            {
                Temperature = 0.2f, // Limite la créativité mais permet quand même des formulations naturelles
                TopP = 1.0f // Pas besoin de filtrer la probabilité cumulative, surtout pour des phrases courtes et simples
            };
            while (!string.IsNullOrEmpty(chatMessage))
            {
                try
                {
                    MercatorUi.Wait.WaitStatic.WaitWindow(Api.Iif_langue(Globals.Langue, IifLangueEnum.AIisThinking));
                    Trad trad = openAiChat.Ask<Trad>(chatMessage, "Trad_NL_EN_DE", systemMessage: systemMessage, chatOptions: chatOptions);
                    systemMessage = null;
                    sigForm.StockRecord.S_MODELEN = trad.TradNL ?? "";
                    sigForm.StockRecord.S_MODELEE = trad.TradEN ?? "";
                    sigForm.StockRecord.S_MODELED = trad.TradDE ?? "";
                    MercatorUi.Wait.WaitStatic.WaitClear();
                    chatMessage = MercatorUi.Dialogs.AskMemo("Affiner les traductions avec une consigne supplémentaire ?", "");
                }
                catch (Exception ex)
                {
                    MercatorUi.Wait.WaitStatic.WaitClear();
                    MercatorUi.Dialogs.Stop(ex.Message);
                    chatMessage = "";
                }
            }
        }



        public class Trad
        {
            [MercatorAI.FactoryOpenAI.ChatJsonFormat(Description = "Traduction en NL", IsRequired = true)]
            public string TradNL { get; set; }
            [MercatorAI.FactoryOpenAI.ChatJsonFormat(Description = "Traduction en EN", IsRequired = true)]
            public string TradEN { get; set; }
            [MercatorAI.FactoryOpenAI.ChatJsonFormat(Description = "Traduction en DE", IsRequired = true)]
            public string TradDE { get; set; }
        }
    }
}