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, lang) } 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 === 'ar' ? 'العربية' : lang === 'de' ? 'Deutsch' : lang === 'es' ? 'Español' : lang === 'it' ? 'Italiano' : lang === 'pt' ? 'Português' : lang === 'ru' ? 'Русский' : lang === 'zh' ? '中文' : lang === 'ja' ? '日本語' : lang === 'ko' ? '한국어' : lang === 'nl' ? 'Nederlands' : lang === 'pl' ? 'Polski' : lang === 'hi' ? 'हिन्दी' : lang const schemaLabels = this.getSchemaLabels(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": "${schemaLabels.status}", "type": "select", "options": ["${schemaLabels.statusTodo}", "${schemaLabels.statusInProgress}", "${schemaLabels.statusDone}"] }, { "name": "${schemaLabels.difficulty}", "type": "select", "options": ["${schemaLabels.easy}", "${schemaLabels.medium}", "${schemaLabels.hard}"] } ] } \`\`\` 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 :

/

/

,

,