import { getChatProvider } from '../factory' import { getSystemConfig } from '@/lib/config' import { preprocessMathInHtml } from '@/lib/text/math-preprocess' export interface GeneratedNote { title: string content: string difficulty?: 'facile' | 'moyen' | 'difficile' } export interface GeneratedCarnet { notes: GeneratedNote[] schemaProperties: Array<{ name: string; type: string; options?: string[] }> } export type WizardProfile = 'student' | 'teacher' | 'engineer' export class NotebookWizardService { async generateCarnet( profile: WizardProfile, topic: string, options?: { level?: string; count?: number; language?: string } ): Promise { const lang = options?.language || 'fr' const count = options?.count || 6 const prompts = this.buildPrompt(profile, topic, lang, count, options?.level) const config = await getSystemConfig() const provider = getChatProvider(config) const raw = await provider.generateText(prompts) return this.parseResponse(raw, profile) } private buildPrompt( profile: WizardProfile, topic: string, lang: string, count: number, level?: string ): string { const langName = lang === 'fr' ? 'français' : lang === 'en' ? 'English' : lang === 'fa' ? 'فارسی' : lang const profileContext = { student: `Tu crées des notes de cours pour un étudiant. Le contenu doit être pédagogique, clair, avec des exemples.`, teacher: `Tu crées la structure d'un cours pour un professeur. Chaque note est un chapitre avec des sections à remplir, des objectifs, et des exercices.`, engineer: `Tu crées une documentation technique. Le contenu doit être précis, structuré, avec des spécifications et des références.`, }[profile] return `Tu es un expert pédagogue et créateur de contenu de haut niveau. ${profileContext} Sujet : "${topic}" ${level ? `Niveau : ${level}` : ''} Langue : ${langName} Nombre de notes à créer : ${count} CRÉE ${count} NOTES COMPLÈTES ET DÉTAILLÉES sur ce sujet. Chaque note doit faire ENTRE 800 ET 1500 MOTS minimum. C'est non négociable. Le contenu doit être : - COMPLET et APPROFONDI — pas de résumé superficiel - Structuré avec des titres

et

pour les sections - Des paragraphes développés avec des explications détaillées - Des exemples concrets et des cas d'usage - Des définitions précises dans des encadrés callout ${profile === 'student' ? '- Des "Points clés à retenir" en callout tip\n- Des "Pièges à éviter" en callout danger\n- Des exemples d\'application' : ''} ${profile === 'teacher' ? '- Des objectifs pédagogiques en début de note\n- Des sections "Exercices" avec 5 questions détaillées\n- Des corrigés indicatifs' : ''} ${profile === 'engineer' ? '- Des spécifications techniques précises\n- Des tableaux comparatifs\n- Des références aux normes et standards' : ''} FORMAT DE SORTIE — JSON UNIQUEMENT : \`\`\`json { "notes": [ { "title": "Titre détaillé et descriptif", "difficulty": "facile", "content": "

Introduction

Plusieurs paragraphes détaillés...

..." } ], "schemaProperties": [ { "name": "Statut", "type": "select", "options": ["À réviser", "En cours", "Maîtrisé"] }, { "name": "Difficulté", "type": "select", "options": ["Facile", "Moyen", "Difficile"] } ] } \`\`\` BLOCS HTML DISPONIBLES — UTILISE-LES ABONDAMMENT : 1. **Callout** (encadré coloré) :

Définition importante...

Types : info, warning, tip, success, danger 2. **Toggle** (section repliable pour détails) :

Cliquer pour voir les détails

Contenu détaillé...

3. **Math** (formules LaTeX) — UTILISE LES BALISES DIRECTEMENT, pas de $$ : Block :
Inline : x^2 N'UTILISE JAMAIS $$ ou $ comme délimiteur — utilise TOUJOURS les balises HTML ci-dessus. 4. **Colonnes** (comparaison côte à côte) :

Concept A...

Concept B...

5. **Sommaire** (début de note) :
6. HTML standard :

/

/

,

,