import type { Locale } from './types'
import { appLocale } from './appConfig'

type MessageMap = Record<string, string>
type Messages = Record<Locale, MessageMap>

const messages: Messages = {
  fr: {
    // Sidebar
    'nav.home': 'Accueil',
    'nav.studio': 'Studio',
    'nav.documents': 'Documents',
    'nav.history': 'Historique',
    'nav.settings': 'Paramètres',
    'nav.collapse': 'Réduire la barre latérale',
    'nav.expand': 'Développer la barre latérale',

    // Top bar
    'topbar.newAnalysis': 'Nouvelle analyse',

    // Home
    'home.title': 'Docling Studio',
    'home.subtitle':
      'Analysez, explorez et validez la structure de vos documents PDF grâce à Docling.',
    'home.documents': 'Documents',
    'home.analyses': 'Analyses',
    'home.recentDocs': 'Documents récents',

    // Studio — import
    'studio.title': 'Intelligence des documents',
    'studio.subtitle': "Importez un document PDF pour commencer l'analyse avec Docling",
    'studio.recentDocs': 'Documents récents',

    // Studio — workspace
    'studio.configure': 'Configurer',
    'studio.verify': 'Vérifier',
    'studio.addFiles': 'Ajouter des fichiers',
    'studio.analyzing': 'Analyse...',
    'studio.run': 'Exécuter',
    'studio.loaded': 'Chargé',
    'studio.analysisRunning': 'Analyse en cours...',
    'studio.failed': 'Échec',
    'studio.visual': 'Visuel',

    // Config panel
    'config.model': 'Modèle',
    'config.pipeline': 'Pipeline',
    'config.ocr': 'OCR',
    'config.ocrHint':
      'Applique la reconnaissance optique de caractères sur les pages scannées ou les images intégrées. Indispensable pour les PDF non-natifs.',
    'config.tableStructure': 'Extraction des tableaux',
    'config.tableStructureHint':
      'Détecte les tableaux dans le document et reconstruit leur structure lignes/colonnes via le modèle TableFormer, avec correspondance des cellules.',
    'config.tableMode': 'Mode tableaux',
    'config.tableModeAccurate': 'Précis',
    'config.tableModeFast': 'Rapide',
    'config.enrichment': 'Enrichissement',
    'config.codeEnrichment': 'Code',
    'config.codeEnrichmentHint':
      "Active un modèle OCR spécialisé pour les blocs de code, préservant l'indentation et la syntaxe.",
    'config.formulaEnrichment': 'Formules',
    'config.formulaEnrichmentHint':
      'Reconnaît les formules mathématiques et les convertit en LaTeX via un modèle dédié.',
    'config.pictures': 'Images',
    'config.pictureClassification': 'Classification',
    'config.pictureClassificationHint':
      'Classe chaque image détectée par type (graphique, photo, diagramme, logo…) via un modèle de classification.',
    'config.pictureDescription': 'Description',
    'config.pictureDescriptionHint':
      "Génère une description textuelle de chaque image via un Vision Language Model (VLM). Utile pour l'accessibilité et l'indexation.",
    'config.generatePictureImages': 'Extraire les images',
    'config.generatePictureImagesHint':
      "Extrait les images détectées du document et les sauvegarde en tant que fichiers séparés. Nécessaire pour l'export d'images.",
    'config.generatePageImages': 'Images de pages',
    'config.generatePageImagesHint':
      'Rasterise chaque page du PDF en image. Utile pour la visualisation ou le post-traitement visuel.',
    'config.imagesScale': 'Échelle images',
    'config.documents': 'Documents',

    // Results
    'results.elements': 'Éléments',
    'results.markdown': 'Markdown',
    'results.images': 'Images',
    'results.pageOf': 'Page {current} sur {total}',
    'results.noElements': 'Aucun élément détecté sur cette page',
    'results.noImages': 'Aucune image détectée dans ce document',
    'results.noMarkdown': 'Pas de contenu markdown',
    'results.runAnalysis': 'Lancez une analyse pour voir les résultats',
    'results.analysisFailed': "L'analyse a échoué",
    'results.copy': 'Copier',
    'results.copied': 'Copié !',
    'results.page': 'Page',

    // Upload
    'upload.drop': 'Déposez un PDF ici ou cliquez pour importer',
    'upload.uploading': 'Import en cours...',
    'upload.maxSize': 'Max {n}Mo',
    'upload.invalidFormat': 'Format invalide — seuls les fichiers PDF sont acceptés.',
    'upload.tooLarge': 'Fichier trop volumineux (max {n} Mo).',
    'upload.maxPages': 'Max {n} pages',

    // History
    'history.title': 'Historique',
    'history.tabAnalyses': 'Analyses',
    'history.tabDocuments': 'Documents',
    'history.empty': 'Aucune analyse. Allez dans Studio pour analyser votre premier document.',
    'history.emptyDocs': 'Aucun document. Importez un document depuis le Studio.',
    'history.open': 'Ouvrir',

    // Ingestion / My Documents
    'ingestion.search': 'Rechercher…',
    'ingestion.sortName': 'Nom',
    'ingestion.sortDate': 'Date',
    'ingestion.filterAll': 'Tous',
    'ingestion.filterIndexed': 'Indexés',
    'ingestion.filterNotIndexed': 'Non indexés',
    'ingestion.indexed': 'Indexé',
    'ingestion.notIndexed': 'Non indexé',
    'ingestion.chunksIndexed': '{n} chunks',
    'ingestion.openInStudio': 'Ouvrir dans Studio',
    'ingestion.ingest': 'Indexer',
    'ingestion.ingesting': 'Indexation…',
    'ingestion.ingestSuccess': 'Indexation réussie — {n} chunks indexés.',
    'ingestion.ingestError': 'Erreur d\u2019indexation : {msg}',

    // Chunking
    'studio.prepare': 'Préparer',
    'chunking.settings': 'Chunking',
    'chunking.chunkerType': 'Type de chunker',
    'chunking.maxTokens': 'Tokens max',
    'chunking.mergePeers': 'Fusionner les pairs',
    'chunking.repeatTableHeader': 'Répéter en-têtes tableaux',
    'chunking.run': 'Chunker',
    'chunking.chunking': 'Chunking...',
    'chunking.chunks': 'chunks',
    'chunking.noChunks': 'Lancez le chunking pour préparer les segments.',
    'chunking.noChunksOnPage': 'Aucun chunk sur cette page.',
    'chunking.edit': 'Modifier',
    'chunking.save': 'Enregistrer',
    'chunking.saving': 'Enregistrement...',
    'chunking.cancel': 'Annuler',
    'chunking.modified': 'modifié',
    'chunking.delete': 'Supprimer',
    'chunking.deleting': 'Suppression...',
    'chunking.deleteConfirm':
      'Supprimer ce chunk ? Il sera marqué comme supprimé jusqu\u2019à la prochaine synchronisation.',
    'chunking.batchNotice':
      'Le chunking n\u2019est pas disponible pour cette analyse. Les documents volumineux trait\u00e9s par batch ne g\u00e9n\u00e8rent pas la structure interne n\u00e9cessaire au d\u00e9coupage.',

    // Pagination
    'pagination.pageOf': 'Page {current} sur {total}',
    'pagination.perPage': '/ page',

    // Settings
    'settings.title': 'Paramètres',
    'settings.apiUrl': 'API URL',
    'settings.version': 'Version',
    'settings.theme': 'Thème',
    'settings.themeDark': 'Sombre',
    'settings.themeLight': 'Clair',
    'settings.language': 'Langue',
    'settings.about': '\u00C0 propos',
    'settings.designArticle': 'Comment Docling Studio a \u00e9t\u00e9 con\u00e7u',

    // Disclaimer
    'disclaimer.banner':
      'Instance de d\u00e9monstration \u2014 les documents upload\u00e9s sont partag\u00e9s et temporaires (max {n} Mo). Ne pas envoyer de fichiers confidentiels.',
  },
  en: {
    'nav.home': 'Home',
    'nav.studio': 'Studio',
    'nav.documents': 'Documents',
    'nav.history': 'History',
    'nav.settings': 'Settings',
    'nav.collapse': 'Collapse sidebar',
    'nav.expand': 'Expand sidebar',

    'topbar.newAnalysis': 'New analysis',

    'home.title': 'Docling Studio',
    'home.subtitle':
      'Analyze, explore and validate the structure of your PDF documents with Docling.',
    'home.documents': 'Documents',
    'home.analyses': 'Analyses',
    'home.recentDocs': 'Recent documents',

    'studio.title': 'Document Intelligence',
    'studio.subtitle': 'Upload a PDF document to start analyzing with Docling',
    'studio.recentDocs': 'Recent documents',

    'studio.configure': 'Configure',
    'studio.verify': 'Verify',
    'studio.addFiles': 'Add files',
    'studio.analyzing': 'Analyzing...',
    'studio.run': 'Run',
    'studio.loaded': 'Loaded',
    'studio.analysisRunning': 'Analysis running...',
    'studio.failed': 'Failed',
    'studio.visual': 'Visual',

    'config.model': 'Model',
    'config.pipeline': 'Pipeline',
    'config.ocr': 'OCR',
    'config.ocrHint':
      'Applies Optical Character Recognition on scanned pages or embedded images. Essential for non-native PDFs.',
    'config.tableStructure': 'Table extraction',
    'config.tableStructureHint':
      'Detects tables in the document and reconstructs their row/column structure using the TableFormer model, with cell matching.',
    'config.tableMode': 'Table mode',
    'config.tableModeAccurate': 'Accurate',
    'config.tableModeFast': 'Fast',
    'config.enrichment': 'Enrichment',
    'config.codeEnrichment': 'Code',
    'config.codeEnrichmentHint':
      'Activates a specialized OCR model for code blocks, preserving indentation and syntax.',
    'config.formulaEnrichment': 'Formulas',
    'config.formulaEnrichmentHint':
      'Recognizes mathematical formulas and converts them to LaTeX using a dedicated model.',
    'config.pictures': 'Pictures',
    'config.pictureClassification': 'Classification',
    'config.pictureClassificationHint':
      'Classifies each detected image by type (chart, photo, diagram, logo…) using a classification model.',
    'config.pictureDescription': 'Description',
    'config.pictureDescriptionHint':
      'Generates a text description for each image using a Vision Language Model (VLM). Useful for accessibility and indexing.',
    'config.generatePictureImages': 'Extract pictures',
    'config.generatePictureImagesHint':
      'Extracts detected images from the document and saves them as separate files. Required for image export.',
    'config.generatePageImages': 'Page images',
    'config.generatePageImagesHint':
      'Rasterizes each PDF page as an image. Useful for visual preview or post-processing.',
    'config.imagesScale': 'Images scale',
    'config.documents': 'Documents',

    'results.elements': 'Elements',
    'results.markdown': 'Markdown',
    'results.images': 'Images',
    'results.pageOf': 'Page {current} of {total}',
    'results.noElements': 'No elements detected on this page',
    'results.noImages': 'No images detected in this document',
    'results.noMarkdown': 'No markdown content',
    'results.runAnalysis': 'Run an analysis to see results',
    'results.analysisFailed': 'Analysis failed',
    'results.copy': 'Copy',
    'results.copied': 'Copied!',
    'results.page': 'Page',

    'upload.drop': 'Drop a PDF here or click to upload',
    'upload.uploading': 'Uploading...',
    'upload.maxSize': 'Max {n}MB',
    'upload.invalidFormat': 'Invalid format — only PDF files are accepted.',
    'upload.tooLarge': 'File too large (max {n} MB).',
    'upload.maxPages': 'Max {n} pages',

    'history.title': 'History',
    'history.tabAnalyses': 'Analyses',
    'history.tabDocuments': 'Documents',
    'history.empty': 'No analyses yet. Go to Studio to analyze your first document.',
    'history.emptyDocs': 'No documents yet. Upload a document from the Studio.',
    'history.open': 'Open',

    // Ingestion / My Documents
    'ingestion.search': 'Search…',
    'ingestion.sortName': 'Name',
    'ingestion.sortDate': 'Date',
    'ingestion.filterAll': 'All',
    'ingestion.filterIndexed': 'Indexed',
    'ingestion.filterNotIndexed': 'Not indexed',
    'ingestion.indexed': 'Indexed',
    'ingestion.notIndexed': 'Not indexed',
    'ingestion.chunksIndexed': '{n} chunks',
    'ingestion.openInStudio': 'Open in Studio',
    'ingestion.ingest': 'Index',
    'ingestion.ingesting': 'Indexing…',
    'ingestion.ingestSuccess': 'Indexed successfully — {n} chunks.',
    'ingestion.ingestError': 'Indexing error: {msg}',

    'studio.prepare': 'Prepare',
    'chunking.settings': 'Chunking',
    'chunking.chunkerType': 'Chunker type',
    'chunking.maxTokens': 'Max tokens',
    'chunking.mergePeers': 'Merge peers',
    'chunking.repeatTableHeader': 'Repeat table headers',
    'chunking.run': 'Chunk',
    'chunking.chunking': 'Chunking...',
    'chunking.chunks': 'chunks',
    'chunking.noChunks': 'Run chunking to prepare segments.',
    'chunking.noChunksOnPage': 'No chunks on this page.',
    'chunking.edit': 'Edit',
    'chunking.save': 'Save',
    'chunking.saving': 'Saving...',
    'chunking.cancel': 'Cancel',
    'chunking.modified': 'modified',
    'chunking.delete': 'Delete',
    'chunking.deleting': 'Deleting...',
    'chunking.deleteConfirm':
      'Delete this chunk? It will be marked as deleted until the next sync.',
    'chunking.batchNotice':
      'Chunking is not available for this analysis. Large documents processed in batch mode do not generate the internal structure required for chunking.',

    'pagination.pageOf': 'Page {current} of {total}',
    'pagination.perPage': '/ page',

    'settings.title': 'Settings',
    'settings.apiUrl': 'API URL',
    'settings.version': 'Version',
    'settings.theme': 'Theme',
    'settings.themeDark': 'Dark',
    'settings.themeLight': 'Light',
    'settings.language': 'Language',
    'settings.about': 'About',
    'settings.designArticle': 'How Docling Studio was designed',

    // Disclaimer
    'disclaimer.banner':
      'Demo instance \u2014 uploaded documents are shared and temporary (max {n} MB). Do not upload confidential files.',
  },
}

export function useI18n() {
  function t(key: string, params: Record<string, string | number> = {}): string {
    let str = messages[appLocale.value]?.[key] || messages['fr'][key] || key
    for (const [k, v] of Object.entries(params)) {
      str = str.replaceAll(`{${k}}`, String(v))
    }
    return str
  }

  return { t }
}
