/**
 * pdf-templates — dispatcher : sélectionne le bon thème et rend en Buffer.
 *
 * Le code applicatif (`#services/invoice_pdf`) appelle `renderInvoiceToBuffer`
 * qui :
 *   1. Choisit le composant React selon `themeSlug`
 *   2. Le rend en PDF via `@react-pdf/renderer.renderToBuffer`
 *   3. Retourne le Buffer prêt à être uploadé sur MinIO ou streamé
 *
 * Les 4 thèmes consomment tous le même `InvoiceTemplateProps` (cf. common.tsx),
 * ce qui permet d'ajouter ou de remplacer un thème sans toucher au dispatcher.
 */

import React from 'react'
import { renderToBuffer, type DocumentProps } from '@react-pdf/renderer'
import {
  type InvoiceTemplateProps,
  type InvoiceThemeSlug,
} from '#pdf-templates/common'
import { ClassiqueTemplate } from '#pdf-templates/classique'
import { ModerneTemplate } from '#pdf-templates/moderne'
import { MinimalTemplate } from '#pdf-templates/minimal'
import { ElegantTemplate } from '#pdf-templates/elegant'

/** Mapping slug → composant. Source de vérité du dispatcher. */
const THEMES: Record<
  InvoiceThemeSlug,
  (props: InvoiceTemplateProps) => React.ReactElement<DocumentProps>
> = {
  classique: ClassiqueTemplate,
  moderne: ModerneTemplate,
  minimal: MinimalTemplate,
  elegant: ElegantTemplate,
}

/**
 * Rend la facture en PDF (Buffer).
 *
 * @param themeSlug Slug du thème — fallback "classique" si inconnu (defensive).
 * @param props Données passées au template (cf. InvoiceTemplateProps).
 */
export async function renderInvoiceToBuffer(
  themeSlug: InvoiceThemeSlug,
  props: InvoiceTemplateProps
): Promise<Buffer> {
  const Template = THEMES[themeSlug] ?? THEMES.classique
  const element = Template(props)
  return await renderToBuffer(element)
}

export type { InvoiceTemplateProps, InvoiceThemeSlug }
