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
            Forms.Sig.SigForm sigForm = (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.FactoryGemini factory = new MercatorAI.FactoryGemini();
            MercatorAI.Interfaces.IGeminiChat geminiChat = factory.CreateGeminiChat("gemini-2.5-flash", out string error);
            if (!string.IsNullOrEmpty(error))
            {
                Dialogs.Stop("Impossible d'initialiser le chat de Gemini : " + 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 = "À traduire : \"" + sigForm.StockRecord.S_MODELE + "\"";
            while (!string.IsNullOrEmpty(chatMessage))
            {
                Wait.WaitStatic.WaitWindowBaseThread(Api.Iif_langue(Globals.Langue, IifLangueEnum.AIisThinking));
                Trad trad = null;
                _BaseClasses.ExclusiveBackgroundWorkerAsync exclusiveBackgroundWorkerAsync = new _BaseClasses.ExclusiveBackgroundWorkerAsync(async () => trad = await geminiChat.AskAsync<Trad>(chatMessage, systemMessage: systemMessage));
                Wait.WaitStatic.WaitClearBaseThread();
                if (exclusiveBackgroundWorkerAsync.ExceptionDuringDoWork != null)
                {
                    Wait.WaitStatic.WaitClearBaseThread();
                    Dialogs.Stop(exclusiveBackgroundWorkerAsync.ExceptionDuringDoWork.Message + (exclusiveBackgroundWorkerAsync.ExceptionDuringDoWork.InnerException != null ? "\r\n" + exclusiveBackgroundWorkerAsync.ExceptionDuringDoWork.InnerException.Message : ""));
                    return;
                }
                sigForm.StockRecord.S_MODELEN = trad.TradNL ?? "";
                sigForm.StockRecord.S_MODELEE = trad.TradEN ?? "";
                sigForm.StockRecord.S_MODELED = trad.TradDE ?? "";
                Wait.WaitStatic.WaitClear();
                string consigneSuppl = Dialogs.AskMemo("Affiner les traductions avec une consigne supplémentaire ?", "");
                if (!string.IsNullOrWhiteSpace(consigneSuppl))
                    chatMessage = consigneSuppl + "\n" + "À traduire : \"" + sigForm.StockRecord.S_MODELE + "\"";
                else
                    return;
            }
        }

        public class Trad
        {
            public string TradNL { get; set; }
            public string TradEN { get; set; }
            public string TradDE { get; set; }
        }
    }
}