namespace ToolsServices
{
    public static class PromptService
    {
        #region Enum
        public enum ePrompt
        {
            ReActAgent_PromptSystem_LLM_Coder,
            ReActAgent_GenerateImage,
            ReActAgent_GenerateImageV2,
            ReActAgent_RechercheRAG,
            ReActAgent_SummarizeDoc,
            ReActAgent_SummarizeIntegralLongDoc,
            ReActAgent_SummarizeIntegralLongDoc_Final,
            GenererCVService_GenerateOneCV_Extract,
            GenererCVService_GenerateOneCV_Format,
            RechercheCVService_RechercheCV_Analyse,
            RechercheCVService_RechercheCV_Generate,
            
            EmailService_Generer_Mail,

            EmailService_AnalyserMail_Resume,
            EmailService_AnalyserMail_Resume_PJ,
            EmailService_AnalyserMail_Categorie,
            EmailService_AnalyserMail_Strategie,
            EmailService_AnalyserMail_Reponse,
            EmailService_AnalyserMail_Reponse_PJ,

            EmailSendService_AnalyserMail_BesoinReponse,
            EmailSendService_AnalyserMail_AllPointsChecked,
            EmailSendService_AnalyserMail_Relance,

            FactureService_AnalyserFacture_Extract,
            TF_From_DSFService_GenereTF,
            OllamaService_PromptSystem,

            TranscriptionAndResumeService_Resume
        }
        #endregion

        #region Propriétés
        public static string PromptNoQuery { get; }="No @QUERY";
        #endregion
        //
        #region Méthodes publiques
        public static string GetPromptBrut(ePrompt type)
        {
            string file = GetFileFromType(type);
            var txt = "";
            if (!File.Exists(file))
            {
                CreatePromptFile(type, file);
            }

            txt = TxtService.ExtractTextFromTxt(file);
            if ((txt.Trim().Length == 0))
            {
                LoggerService.LogWarning($"Contenu vide. Fichier prompt : {file} ");
                txt = CreatePromptFile(type, file);
            }
            return txt;
        }

        public static string GetPrompt(ePrompt type, string query="", string context1 = "", string context2 = "", string context3 = "", string context4 = "", string context5 = "", string context6 = "", string context7 = "")
        {
            try
            {
                var txt = GetPromptBrut(type);

                txt = txt.Replace("@QUERY", query);
                txt = txt.Replace("@CONTEXT1", context1);
                txt = txt.Replace("@CONTEXT2", context2);
                txt = txt.Replace("@CONTEXT3", context3);
                txt = txt.Replace("@CONTEXT4", context4);
                txt = txt.Replace("@CONTEXT5", context5);
                txt = txt.Replace("@CONTEXT6", context6);
                txt = txt.Replace("@CONTEXT7", context7);

                return txt;
            }
            catch (Exception ex)
            {
                LoggerService.LogError($"PromptService.GetPrompt : {ex.Message}");
                return string.Empty;
            }
        }
        
        public  static (bool, string) SavePrompt(ePrompt type, string prompt, bool isConfirm=false)
        {
            try
            {
                if(prompt.Contains("@QUERY", StringComparison.CurrentCulture)
                    || (!prompt.Contains("@QUERY", StringComparison.CurrentCulture) && isConfirm))
                {
                    TxtService.CreateTextFile(GetFileFromType(type), prompt);
                }
                else
                {
                    LoggerService.LogWarning($"PromptService.SavePrompt : Pas de @QUERY dans le prompt. Sauvegarde annulée.");
                    return (false, PromptNoQuery);
                }
            }

            catch (Exception ex)
            {
                LoggerService.LogError($"PromptService.SavePrompt : {ex.Message}");
                return (false, ex.Message);
            }
            return (true, "");
        }

        public static List<ePrompt> GetAllPrompts()
        {
            return Enum.GetValues(typeof(ePrompt)).Cast<ePrompt>().ToList();
        }
        #endregion

        #region Méthodes privées
        private static string GetFileFromType(ePrompt type)
        {
            string file = string.Empty;
            switch (type)
            {
                case ePrompt.ReActAgent_PromptSystem_LLM_Coder:
                    file = FichiersInternesService.PromptFiles.ReActAgent_PromptSystem_LLM_Coder;
                    break;
                case ePrompt.ReActAgent_GenerateImage:
                    file = FichiersInternesService.PromptFiles.ReActAgent_GenerateImage;
                    break;
                case ePrompt.ReActAgent_GenerateImageV2:
                    file = FichiersInternesService.PromptFiles.ReActAgent_GenerateImageV2;
                    break;
                case ePrompt.ReActAgent_RechercheRAG:
                    file = FichiersInternesService.PromptFiles.ReActAgent_RechercheRAG;
                    break;
                case ePrompt.ReActAgent_SummarizeDoc:
                    file = FichiersInternesService.PromptFiles.ReActAgent_SummarizeDoc;
                    break;
                case ePrompt.ReActAgent_SummarizeIntegralLongDoc:
                    file = FichiersInternesService.PromptFiles.ReActAgent_SummarizeIntegralLongDoc;
                    break;
                case ePrompt.ReActAgent_SummarizeIntegralLongDoc_Final:
                    file = FichiersInternesService.PromptFiles.ReActAgent_SummarizeIntegralLongDoc_Final;
                    break;
                case ePrompt.GenererCVService_GenerateOneCV_Extract:
                    file = FichiersInternesService.PromptFiles.GenererCVService_GenerateOneCV_Extract;
                    break;
                case ePrompt.GenererCVService_GenerateOneCV_Format:
                    file = FichiersInternesService.PromptFiles.GenererCVService_GenerateOneCV_Format;
                    break;
                case ePrompt.RechercheCVService_RechercheCV_Analyse:
                    file = FichiersInternesService.PromptFiles.RechercheCVService_RechercheCV_Analyse;
                    break;
                case ePrompt.RechercheCVService_RechercheCV_Generate:
                    file = FichiersInternesService.PromptFiles.RechercheCVService_RechercheCV_Generate;
                    break;
                case ePrompt.EmailService_Generer_Mail:
                    file = FichiersInternesService.PromptFiles.EmailService_Generer_Mail;
                    break;
                case ePrompt.EmailService_AnalyserMail_Resume:
                    file = FichiersInternesService.PromptFiles.EmailService_AnalyserMail_Resume;
                    break;
                case ePrompt.EmailService_AnalyserMail_Resume_PJ:
                    file = FichiersInternesService.PromptFiles.EmailService_AnalyserMail_Resume_PJ;
                    break;
                case ePrompt.EmailService_AnalyserMail_Categorie:
                    file = FichiersInternesService.PromptFiles.EmailService_AnalyserMail_Categorie;
                    break;
                case ePrompt.EmailService_AnalyserMail_Strategie:
                    file = FichiersInternesService.PromptFiles.EmailService_AnalyserMail_Strategie;
                    break;
                case ePrompt.EmailService_AnalyserMail_Reponse:
                    file = FichiersInternesService.PromptFiles.EmailService_AnalyserMail_Reponse;
                    break;
                case ePrompt.EmailService_AnalyserMail_Reponse_PJ:
                    file = FichiersInternesService.PromptFiles.EmailService_AnalyserMail_Reponse_PJ;
                    break;
                case ePrompt.EmailSendService_AnalyserMail_BesoinReponse:
                    file = FichiersInternesService.PromptFiles.EmailSendService_AnalyserMail_BesoinReponse;
                    break;
                case ePrompt.EmailSendService_AnalyserMail_AllPointsChecked:
                    file = FichiersInternesService.PromptFiles.EmailSendService_AnalyserMail_AllPointsChecked;
                    break;
                case ePrompt.EmailSendService_AnalyserMail_Relance:
                    file = FichiersInternesService.PromptFiles.EmailSendService_AnalyserMail_Relance;
                    break;
                case ePrompt.FactureService_AnalyserFacture_Extract:
                    file = FichiersInternesService.PromptFiles.FactureService_AnalyserFacture_Extract;
                    break;
                case ePrompt.TF_From_DSFService_GenereTF:
                    file = FichiersInternesService.PromptFiles.TF_From_DSFService_GenereTF;
                    break;
                case ePrompt.OllamaService_PromptSystem:
                    file = FichiersInternesService.PromptFiles.OllamaService_PromptSystem;
                    break;
                case ePrompt.TranscriptionAndResumeService_Resume:
                    file = FichiersInternesService.PromptFiles.TranscriptionAndResumeService_Resume;
                    break;

                default:
                    LoggerService.LogError($"PromptService.GetFileFromType : Type de prompt inconnu : {type}");
                    throw new ArgumentException($"Type de prompt inconnu : {type}");
            }
            return file;
        }

        private static string CreatePromptFile(ePrompt type, string file)
        {
            try
            {
                string txt = string.Empty;
                switch (type)
                {
                    case ePrompt.ReActAgent_PromptSystem_LLM_Coder:
                        txt = CreatePromptFile_ReActAgent_PromptSystem_LLM_Coder();
                        break;
                    case ePrompt.ReActAgent_GenerateImage:
                        txt = CreatePromptFile_ReActAgent_GenerateImage();
                        break;
                    case ePrompt.ReActAgent_GenerateImageV2:
                        txt = CreatePromptFile_ReActAgent_GenerateImageV2();
                        break;
                    case ePrompt.ReActAgent_RechercheRAG:
                        txt = CreatePromptFile_ReActAgent_RechercheRAG();
                        break;
                    case ePrompt.ReActAgent_SummarizeDoc:
                        txt = CreatePromptFile_ReActAgent_SummarizeDoc();
                        break;
                    case ePrompt.ReActAgent_SummarizeIntegralLongDoc:
                        txt = CreatePromptFile_ReActAgent_SummarizeIntegralLongDoc();
                        break;
                    case ePrompt.ReActAgent_SummarizeIntegralLongDoc_Final:
                        txt = CreatePromptFile_ReActAgent_SummarizeIntegralLongDoc_Final();
                        break;
                    case ePrompt.GenererCVService_GenerateOneCV_Extract:
                        txt = CreatePromptFile_GenererCVService_GenerateOneCV_Extract();
                        break;
                    case ePrompt.GenererCVService_GenerateOneCV_Format:
                        txt = CreatePromptFile_GenererCVService_GenerateOneCV_Format();
                        break;
                    case ePrompt.RechercheCVService_RechercheCV_Analyse:
                        txt = CreatePromptFile_RechercheCVService_RechercheCV_Analyse();
                        break;
                    case ePrompt.RechercheCVService_RechercheCV_Generate:
                        txt = CreatePromptFile_RechercheCVService_RechercheCV_Generate();
                        break;
                    case ePrompt.EmailService_Generer_Mail:
                        txt = CreatePromptFile_EmailService_Generer_Mail();
                        break;
                    case ePrompt.EmailService_AnalyserMail_Resume:
                        txt = CreatePromptFile_EmailService_AnalyserMail_Resume();
                        break;
                    case ePrompt.EmailService_AnalyserMail_Resume_PJ:
                        txt = CreatePromptFile_EmailService_AnalyserMail_Resume_PJ();
                        break;
                    case ePrompt.EmailService_AnalyserMail_Categorie:
                        txt = CreatePromptFile_EmailService_AnalyserMail_Categorie();
                        break;
                    case ePrompt.EmailService_AnalyserMail_Strategie:
                        txt = CreatePromptFile_EmailService_AnalyserMail_Strategie();
                        break;
                    case ePrompt.EmailService_AnalyserMail_Reponse:
                        txt = CreatePromptFile_EmailService_AnalyserMail_Reponse();
                        break;
                    case ePrompt.EmailService_AnalyserMail_Reponse_PJ:
                        txt = CreatePromptFile_EmailService_AnalyserMail_Reponse_PJ();
                        break;
                    case ePrompt.EmailSendService_AnalyserMail_BesoinReponse:
                        txt = CreatePromptFile_EmailSendService_AnalyserMail_BesoinReponse();
                        break;
                    case ePrompt.EmailSendService_AnalyserMail_AllPointsChecked:
                        txt = CreatePromptFile_EmailSendService_AnalyserMail_AllPointsChecked();
                        break;
                    case ePrompt.EmailSendService_AnalyserMail_Relance:
                        txt = CreatePromptFile_EmailSendService_AnalyserMail_Relance();
                        break;
                    case ePrompt.FactureService_AnalyserFacture_Extract:
                        txt = CreatePromptFile_FactureService_AnalyserFacture_Extract();
                        break;
                    case ePrompt.TranscriptionAndResumeService_Resume:
                        txt = CreatePromptFile_TranscriptionAndResumeService_Resume();
                        break;
                    case ePrompt.TF_From_DSFService_GenereTF:
                        txt = CreatePromptFile_TF_From_DSFService_GenereTF();
                        break;
                    case ePrompt.OllamaService_PromptSystem:
                        txt = CreatePromptFile_OllamaService_PromptSystem();
                        break;

                    default:
                        LoggerService.LogError($"PromptService.CreatePromptFile : Type de prompt inconnu : {type}");
                        throw new ArgumentException($"Type de prompt inconnu : {type}");
                }
                TxtService.CreateTextFile(file, txt);
                LoggerService.LogInfo($"PromptService.CreatePromptFile : Fichier créé : {file}");
                return txt;
            }
            catch (Exception ex)
            {
                LoggerService.LogError($"PromptService.CreatePromptFile : {ex.Message}");
                return string.Empty;
            }
        }

        private static string CreatePromptFile_OllamaService_PromptSystem()
        {
            var txt = """
                Donne toujours tes réponses dans la langue Française 
                Réponds uniquement avec des faits vérifiables. Si tu n'es pas sûr, réponds 'je ne sais pas'.
                """;
            return txt;
        }

        private static string CreatePromptFile_TranscriptionAndResumeService_Resume()
        {
            var txt = """
                Tu es un expert en résumé de texte.
                Résume le texte suivant de manière claire et concise, en utilisant des phrases complètes.
                Le contexte de ce texte est le suivant : @CONTEXT1

                Texte à résumer :
                @QUERY
                """;
            return txt;
        }

        private static string CreatePromptFile_TF_From_DSFService_GenereTF()
        {
            var txt = """
                Tu es un expert analyste de tests logiciels.
                Tu vas lire un document technique (spécifications fonctionnelles internes) et en déduire des cas de tests.
                Ne prends en compte que les chapitres "règles de gestion" pour générer les cas de tests.
                Pour chaque cas de test créé, tu indiques la référence de la règle de gestion (ID du tableau Regles de gestion)

                Important : Il ne s’agit PAS d’une œuvre protégée par copyright, mais bien d’un document technique interne.

                Produit le résultat directement au format CSV avec les colonnes :
                ID;Référence règle de gestion;Titre;Préconditions;Étapes;Résultat attendu

                Spécification :
                ---
                @QUERY
                ---
                """;
            return txt;
        }

        private static string CreatePromptFile_FactureService_AnalyserFacture_Extract()
        {
            var txt = """
                Tu es un assistant spécialisé dans l'extraction d'informations depuis des factures.
                Je vais te fournir le contenu brut d’une facture (texte brut sans mise en forme).
                À partir de ce contenu, génère un document structuré au format XML en respectant la structure suivante :

                <?xml version="1.0" encoding="UTF-8"?>
                <FACTURE>
                  <Numero_facture></Numero_facture>
                  <Date_facture></Date_facture>
                  <Client>
                	<code_client></code_client>
                	<Nom></Nom>
                	<Email></Email>
                	<Telephone></Telephone>
                	<Adresse></Adresse>
                	<SIRET></SIRET>
                  </Client>
                  <Fournisseur>
                	<Nom></Nom>
                	<Email></Email>
                	<Telephone></Telephone>
                	<Adresse></Adresse>
                	<SIRET></SIRET>
                  </Fournisseur>
                  <Totaux>
                	<Total_HT></Total_HT>
                	<Total_TVA></Total_TVA>
                	<Total_TTC></Total_TTC>
                  </Totaux>
                  <Articles>
                	<Article>
                	  <Reference></Reference>
                	  <Designation></Designation>
                	  <Prix_unitaire_HT></Prix_unitaire_HT>
                	  <Quantité_achetée></Quantité_achetée>
                	  <Montant_total_HT></Montant_total_HT
                	</Article>
                  </Articles>
                </FACTURE>

                Si une information est absente, laisse le champ vide. Ne fais aucun commentaire, retourne uniquement le XML.
                N'oublie aucun article

                Formate le tout proprement au format XML. 
                Les nombres décimaux doivent être au format universel :
                - pour le séparateur décimal, utilise un point et non une virgule)
                - ne met pas de séparateur de milliers

                Les dates doivent être au format universel (ex : 2025-12-31)

                N'ajoute pas de texte explicatif.

                Voici un exemple :

                Texte brut : Page : 1/1Total HT1 919,02Net HT1 919,02Total TVA383,80Total TTC2 302,82NET A PAYER2 302,82RéférenceDésignationQtéUnitéPrix Uni. HTMt Tot HTTVAMt Tot TTCV/COMMANDE N°CD240457SYLVAINART855850,400m²19,991 007,5020,00...1 209,00ECOGRIS...48,000Sacs18,99911,5220,00...1 093,82Chantier: CCA 10 Sanitaires CA24039REFIN FEEL Warm Struct. 30x60 R réf.OQ79 Bte de 1.26m²WEBER Col Flex Eco Grise 25KgPrix donnés en enlèvement sur notre dépôt de Monthléry38,981 919,022 302,82Facture N°FA7672Date29/03/2024Echéance31/05/2024Mode de paiementVirement 45 jours fi...AEG Construction10 Rue Du Bois Guillaume91000 Evry CourcouronnesTél.: E-mail:a.dimascio@aeg-constructio...Portable:06 70 65 67 70N.I.I.:Date de paiementLR CONCEPTION SARL au capital de 5.000€ -25 Rue des Bourguignons -91310 MontlhéryTVA Intracommunautaire : FR55 491 155 214 -SIREN : 491 155 214 00035 -CODE NAF : 4752ATél : 01 64 49 19 70 -Fax : 01 64 49 73 65 -Email : lrconception@orange.fr 


                XML:
                <?xml version="1.0" encoding="UTF-8"?>
                <FACTURE>
                  <Numero_facture>FA7672</Numero_facture>
                  <Date_facture>2024-03-29</Date_facture>
                  <Client>
                    <code_client></code_client>
                    <Nom>AEG Construction</Nom>
                    <Email>a.dimascio@aeg-construction.fr</Email>
                    <Telephone>06 70 65 67 70</Telephone>
                    <Adresse>10 Rue Du Bois Guillaume, 91000 Evry Courcouronnes</Adresse>
                    <SIRET></SIRET>
                  </Client>
                  <Fournisseur>
                    <Nom>LR CONCEPTION SARL</Nom>
                    <Email>lrconception@orange.fr</Email>
                    <Telephone>01 64 49 19 70</Telephone>
                    <Adresse>25 Rue des Bourguignons, 91310 Montlhéry</Adresse>
                    <SIRET>FR55 491 155 214 - SIREN : 491 155 214 00035</SIRET>
                  </Fournisseur>
                  <Totaux>
                    <Total_HT>1919.02</Total_HT>
                    <Total_TVA>383.8</Total_TVA>
                    <Total_TTC>2302.82</Total_TTC>
                  </Totaux>
                  <Articles>
                    <Article>
                      <Reference>ART8558</Reference>
                      <Designation>REFIN FEEL Warm Struct. 30x60 R réf.OQ79 Bte de 1.26m²</Designation>
                      <Prix_unitaire_HT>19.99</Prix_unitaire_HT>
                      <Quantité_achetée>50.400</Quantité_achetée>
                      <Montant_total_HT>1007.50</Montant_total_HT>
                    </Article>
                    <Article>
                      <Reference>ECOGRIS</Reference>
                      <Designation>WEBER Col Flex Eco Grise 25Kg</Designation>
                      <Prix_unitaire_HT>18.99</Prix_unitaire_HT>
                      <Quantité_achetée>48</Quantité_achetée>
                      <Montant_total_HT>911.952</Montant_total_HT>
                    </Article>
                  </Articles>
                </FACTURE>


                Fin de l'exemple

                A TRAITER
                Voici le contenu de la facture extrait :

                @QUERY
                """;
            return txt;
        }

        private static string CreatePromptFile_EmailSendService_AnalyserMail_Relance()
        {
            var txt = """
                Génère un brouillon de mail en langue française de relance poli basé sur cette conversation :
                Objet : @QUERY
                Contenu : @CONTEXT1

                Voici la signature à insérer en fin de mail :
                Cordialement,
                @CONTEXT2
                @CONTEXT3
                @CONTEXT4 
                """;

            return txt;
        }

        private static string CreatePromptFile_EmailSendService_AnalyserMail_AllPointsChecked()
        {
            var txt = """
                Réponds uniquement par oui ou non. Tous les points de ce mail ont-ils été traités ?
                Début du mail:
                @QUERY
                - fin du mail
                """;

            return txt;
        }

        private static string CreatePromptFile_EmailSendService_AnalyserMail_BesoinReponse()
        {
            var txt = """
                Réponds uniquement par oui ou non. Une réponse est-elle nécessaire à ce mail ?
                Début du mail:
                @QUERY
                - fin du mail
                """;
            return txt;
        }

        private static string CreatePromptFile_EmailService_AnalyserMail_Reponse_PJ()
        {
            var txt = """
                Inclus dans la réponse proposée l'analyse des pièces jointes dont voici le résumé : @QUERY   
                """;
            return txt;
        }

        private static string CreatePromptFile_EmailService_AnalyserMail_Reponse()
        {
            var txt = """
                Rédige une réponse professionnelle à cet email en suivant la stratégie définie.
                Fais bien attention à qui a écrit le mail initial, que tu lui répondes à lui et non à celui qui a écrit un vieux mail et dont tu as la réponse.

                Objet : @QUERY
                Contenu : @CONTEXT1
                Résumé : @CONTEXT2
                Catégorie : @CONTEXT3
                Stratégie : @CONTEXT4

                La réponse doit être claire, polie, adaptée au contexte et suffisamment concise.
                Voici la signature à insérer en fin de mail :
                Cordialement,
                @CONTEXT5
                @CONTEXT6
                @CONTEXT7 

                Ne rajoute rien d'autre à la signature
                """;
            return txt;
        }

        private static string CreatePromptFile_EmailService_AnalyserMail_Strategie()
        {
            var txt = """
                Tu dois choisir une stratégie de réponse à un email.
                
                Catégorie : @QUERY
                Important : @CONTEXT1
                Urgent : @CONTEXT2
                
                Voici les options possibles :
                - Répondre avec une explication simple
                - Demander plus d'informations
                - Présenter des excuses et proposer une solution
                - Accuser réception et informer d'un délai
                
                Choisis la stratégie la plus adaptée en tenant compte de la **catégorie**, de l'**importance** et de l'**urgence**. 
                """;
            return txt;
        }

        private static string CreatePromptFile_EmailService_AnalyserMail_Categorie()
        {
            var txt = """
                Tu dois catégoriser un email en fonction de son contenu.
                Voici le résumé de l'email :
                @QUERY
                
                Catégorise ce message parmi les choix suivants :
                - Demande d'information
                - Réclamation
                - Demande de devis
                - Problème technique (bug, panne, incident)
                - Demande de fonctionnalité / évolution
                - Planning / organisation (délais, réunions, livraisons)
                - Validation / approbation (recette, maquette, cahier des charges)
                - Support utilisateur (aide à l’utilisation, questions non techniques)
                - Partage d’information interne (compte rendu, note, documentation)
                - Commercial / administratif (contrats, factures, commandes)
                - Formation
                - Emploi
                - Demande de réunion
                - Compte-rendu de réunion
                - Autre

                Réponds uniquement par une des catégories listées.  
                """;
            return txt;
        }

        private static string CreatePromptFile_EmailService_AnalyserMail_Resume_PJ()
        {
            var txt = """

                Inclus dans le résumé l'analyse des pièces jointes dont voici le résumé : @QUERY
                """;
            return txt;
        }

        private static string CreatePromptFile_EmailService_AnalyserMail_Resume()
        {
            var txt = """
                Tu es un assistant professionnel chargé d'analyser un e-mail.
                Lis le contenu suivant et fais un résumé clair et concis.

                Ensuite, indique explicitement :
                - Une note d'importance entre 0 et 5 (5 étant la plus haute importance) avec justification si possible
                - Une note d'urgence entre 0 et 5 (5 étant la plus haute importance) avec justification si possible
                - Un mot pour définir l'analyse qui sera soit "Positif", soit "Négatif", soit "Neutre"

                Format de réponse attendu :
                Résumé : ...

                Importance (0-5) : ...
                Urgence (0-5) : ...
                Analyse : ...

                Objet : @QUERY
                Contenu : @CONTEXT1  
                """;
            return txt;
        }

        private static string CreatePromptFile_EmailService_Generer_Mail()
        {
            var txt = """
                Redige un email selon la demande que voici @QUERY. 
                Tiens compte du contexte que voici @CONTEXT1.

                Voici la signature à insérer en fin de mail :
                Cordialement,
                @CONTEXT2
                @CONTEXT3
                @CONTEXT4 
                """;
            return txt;
        }

        private static string CreatePromptFile_RechercheCVService_RechercheCV_Generate()
        {
            var txt = """
                Tu es un assistant spécialisé dans l'extraction d'informations depuis des CV.
                Je vais te fournir le contenu brut d’un CV (texte brut sans mise en forme).
                À partir de ce contenu, génère un document structuré au format XML en respectant la structure suivante :

                <CV>
                  <Identite>
                	<Nom></Nom>
                	<Prenom></Prenom>
                	<Email></Email>
                	<Telephone></Telephone>
                	<Adresse></Adresse>
                	<DateDeNaissance></DateDeNaissance>
                	<Nationalite></Nationalite>
                  </Identite>
                  <Profil></Profil>
                  <Competences>
                	<Competence nom=""..."" niveau=""..."" />
                	...
                  </Competences>
                  <Langues>
                	<Langue nom=""..."" niveau=""..."" />
                	...
                  </Langues>
                  <Experiences>
                	<Experience>
                	  <Poste></Poste>
                	  <Entreprise></Entreprise>
                	  <Lieu></Lieu>
                	  <DateDebut></DateDebut>
                	  <DateFin></DateFin>
                	  <Description></Description>
                	</Experience>
                	...
                  </Experiences>
                  <Formations>
                	<Formation>
                	  <Diplome></Diplome>
                	  <Etablissement></Etablissement>
                	  <DateDebut></DateDebut>
                	  <DateFin></DateFin>
                	</Formation>
                	...
                  </Formations>
                  <Certifications>
                	<Certification>
                	  <Nom></Nom>
                	  <Organisme></Organisme>
                	  <Date></Date>
                	</Certification>
                	...
                  </Certifications>
                </CV>

                Si une information est absente, laisse le champ vide. Ne fais aucun commentaire, retourne uniquement le XML.
                N'oublie aucune expérience, aucune formation, aucune langue, ni aucune certification.
                Formate le tout proprement au format XML. N'ajoute pas de texte explicatif. Commence directement par <document>.

                Voici un contenu PDF extrait :

                @QUERY
                """;
            return txt;
        }

        private static string CreatePromptFile_RechercheCVService_RechercheCV_Analyse()
        {
            var txt = """
                Tu es un expert en recrutement. Ton rôle est d'évaluer la compatibilité entre une offre d'emploi et un CV.

                Analyse comparative :

                1. **Points forts** : liste les éléments du CV qui correspondent bien aux exigences de l'offre (compétences, expériences, formations, etc.).

                2. **Points manquants ou faibles** : identifie les éléments de l'offre qui sont absents ou peu développés dans le CV.

                3. **Note de compatibilité** : donne une note globale de correspondance entre le CV et l'offre, sur 10, avec une explication.

                Voici les documents à comparer :

                ---  
                **Offre d’emploi** :  
                @QUERY

                ---  
                **CV du candidat** :  
                @CONTEXT1

                ---  
                Réponds en suivant la structure suivante :

                **Points forts :**  
                - …

                **Points manquants ou faibles :**  
                - …

                **Note de compatibilité (sur 10) :**  
                X/10 – Explication : …
                """;
            return txt;
        }

        private static string CreatePromptFile_GenererCVService_GenerateOneCV_Format()
        {
            var txt = """
                Voici un CV rédigé en texte. Reformate-le en XML structuré selon ce modèle :

                <CV>
                  <Identite>
                	<Nom></Nom>
                	<Prenom></Prenom>
                	<Email></Email>
                	<Telephone></Telephone>
                	<Adresse></Adresse>
                	<DateDeNaissance></DateDeNaissance>
                	<Nationalite></Nationalite>
                  </Identite>
                  <Profil></Profil>
                  <Competences>
                	<Competence nom="" niveau="" />
                	...
                  </Competences>
                  <Langues>
                	<Langue nom="" niveau="" />
                	...
                  </Langues>
                  <Experiences>
                	<Experience>
                	  <Poste></Poste>
                	  <Entreprise></Entreprise>
                	  <Lieu></Lieu>
                	  <DateDebut></DateDebut>
                	  <DateFin></DateFin>
                	  <Description></Description>
                	</Experience>
                	...
                  </Experiences>
                  <Formations>
                	<Formation>
                	  <Diplome></Diplome>
                	  <Etablissement></Etablissement>
                	  <DateDebut></DateDebut>
                	  <DateFin></DateFin>
                	</Formation>
                	...
                  </Formations>
                  <Certifications>
                	<Certification>
                	  <Nom></Nom>
                	  <Organisme></Organisme>
                	  <Date></Date>
                	</Certification>
                	...
                  </Certifications>
                </CV>

                Si une information est absente, laisse le champ vide. Ne commente pas.

                CV :
                <<<
                @QUERY
                >>>
                """;
            return txt;
        }

        private static string CreatePromptFile_GenererCVService_GenerateOneCV_Extract()
        {
            var txt = """
                Tu es un assistant RH.

                Voici un CV brut :
                <<<
                @QUERY
                >>>

                Ta mission :
                - Réécris le CV de façon à ce qu’il soit mis en valeur
                - Mets en avant les compétences pertinentes
                - Réorganise les expériences importantes
                - Reformule le résumé professionnel avec les bons mots-clés
                - Supprime les parties non utiles pour ce poste

                Rends un CV **entièrement réécrit** au format texte brut. Ne commente pas.
                """;
            return txt;
        }

        private static string CreatePromptFile_ReActAgent_SummarizeIntegralLongDoc_Final()
        {
            var txt = """
                Voici une série de résumés partiels :
                
                @QUERY
                
                Fais un résumé global cohérent en moins de 500 mots.
                """;
            return txt;
        }

        private static string CreatePromptFile_ReActAgent_SummarizeIntegralLongDoc()
        {
            var txt = """
                Tu es un assistant intelligent.

                Ta mission est de lire les extraits suivants d’un document, et d’en produire un résumé synthétique, structuré, et professionnel en moins de 100 mots.
                Ignore les mentions légales ou répétitions

                Extraits :
                @QUERY

                Résumé :
                """;
            return txt;
        }

        private static string CreatePromptFile_ReActAgent_SummarizeDoc()
        {
            var txt = """
                Tu es un assistant intelligent.

                Ta mission est de lire les extraits suivants d’un document, et d’en produire un résumé synthétique, structuré, et professionnel en moins de 100 mots.
                Ignore les mentions légales ou répétitions

                Extraits :
                @QUERY

                Résumé :
                """;
            return txt;
        }

        private static string CreatePromptFile_ReActAgent_RechercheRAG()
        {
            var txt = """
                Tu es un assistant spécialisé dans la lecture de documents d'entreprises.
                Le domaine professionnel concerné est le suivant : @CONTEXT2

                Question : @QUERY

                Context :
                @CONTEXT1

                Réponds uniquement à partir du contexte. 
                Pour chaque information donnée, indique le document dont elle provient.
                Si tu n'as pas la réponse, dis que tu ne sais pas.
                """;
            return txt;
        }

        private static string CreatePromptFile_ReActAgent_PromptSystem_LLM_Coder()
        {
            var txt = """
                Tu es un expert en développement informatique   
                """;
            return txt;
        }

        private static string CreatePromptFile_ReActAgent_GenerateImage()
        {
            var txt = """
                Transforme cette idée en prompt détaillé pour générer une image avec Fooocus : @QUERY   
                """;
            return txt;
        }

        private static string CreatePromptFile_ReActAgent_GenerateImageV2()
        {
            string txt = $$$"""
                Tu es un assistant qui prépare une requête JSON pour Fooocus (text-to-image).  
                À partir de cette description : "@QUERY", remplis toutes les propriétés suivantes de façon cohérente.  
                Dans la partie "style_selections", ne prends que des styles existants dans Fooocus dont voici la liste :
                @CONTEXT1
                Réponds uniquement en JSON valide correspondant à la classe suivante :  

                {
            
                  "prompt": "...",
                  "negative_prompt": "blurry, low quality, distorted, watermark, text, extra limbs, cropped",
                  "style_selections": ["..."],
                  "performance_selection": "Speed | Quality | Extreme Speed",
                  "aspect_ratios_selection": "896*1152 | 1152*896 | 1024*1024 | etc.",
                  "image_number": 1,
                  "image_seed": -1,
                  "sharpness": 2.0,
                  "guidance_scale": 4.0,
                  "base_model_name": "juggernautXL_v8Rundiffusion.safetensors",
                  "refiner_model_name": "None",
                  "refiner_switch": 0.5,
                  "require_base64": false,
                  "async_process": false,
                  "loras": []
                }

                Exemple pour une image "un chat en armure médiévale" :

                {
            
                  "prompt": "A highly detailed illustration of a cat in medieval knight armor, cinematic lighting",
                  "negative_prompt": "blurry, low quality, distorted, watermark, text, cropped",
                  "style_selections": ["Fantasy", "Cinematic"],
                  "performance_selection": "Quality",
                  "aspect_ratios_selection": "1024*1024",
                  "image_number": 1,
                  "image_seed": -1,
                  "sharpness": 2.5,
                  "guidance_scale": 6.0,
                  "base_model_name": "juggernautXL_v8Rundiffusion.safetensors",
                  "refiner_model_name": "None",
                  "refiner_switch": 0.5,
                  "require_base64": false,
                  "async_process": false,
                  "loras": []
                }
                """;
            return txt;
        }
        #endregion
    }
}
