/**
 * Helpers Handlebars personnalisés pour remplacer les filtres Liquid
 * Utilisés pour la génération de contrats PDF avec Gotenberg
 */

import Handlebars from 'handlebars';

/**
 * Enregistre tous les helpers Handlebars personnalisés
 */
export function registerHandlebarsHelpers() {
  // Helper pour remplacer "remove_first" de Liquid
  Handlebars.registerHelper('removeFirst', function(str: string, pattern: string) {
    if (!str) return '';
    return str.replace(pattern, '');
  });

  // Helper pour remplacer "contains" de Liquid
  Handlebars.registerHelper('contains', function(str: string, pattern: string) {
    if (!str) return false;
    return str.includes(pattern);
  });

  // Helper pour remplacer "strip" de Liquid (trim)
  Handlebars.registerHelper('strip', function(str: string) {
    if (!str) return '';
    return str.trim();
  });

  // Helper pour remplacer "join" de Liquid
  Handlebars.registerHelper('join', function(array: any[], separator: string) {
    if (!Array.isArray(array)) return '';
    return array.join(separator);
  });

  // Helper pour split (diviser une chaîne)
  Handlebars.registerHelper('split', function(str: string, delimiter: string) {
    if (!str) return [];
    return str.split(delimiter);
  });

  // Helper pour vérifier l'égalité
  Handlebars.registerHelper('eq', function(a: any, b: any) {
    return a === b;
  });

  // Helper pour vérifier l'inégalité
  Handlebars.registerHelper('ne', function(a: any, b: any) {
    return a !== b;
  });

  // Helper pour vérifier >= 
  Handlebars.registerHelper('gte', function(a: number, b: number) {
    return a >= b;
  });

  // Helper pour vérifier >
  Handlebars.registerHelper('gt', function(a: number, b: number) {
    return a > b;
  });

  // Helper pour vérifier ==
  Handlebars.registerHelper('lte', function(a: number, b: number) {
    return a <= b;
  });

  // Helper pour vérifier <
  Handlebars.registerHelper('lt', function(a: number, b: number) {
    return a < b;
  });

  // Helper pour vérifier si une valeur est vide
  Handlebars.registerHelper('isEmpty', function(value: any) {
    return !value || value === '' || value === 'n/a' || value === 0;
  });

  // Helper pour vérifier si une valeur n'est pas vide
  Handlebars.registerHelper('isNotEmpty', function(value: any) {
    return value && value !== '' && value !== 'n/a' && value !== 0;
  });

  // Helper OR logique
  Handlebars.registerHelper('or', function(...args: any[]) {
    // Enlever le dernier argument qui est l'objet options de Handlebars
    const values = args.slice(0, -1);
    return values.some(v => !!v);
  });

  // Helper AND logique
  Handlebars.registerHelper('and', function(...args: any[]) {
    // Enlever le dernier argument qui est l'objet options de Handlebars
    const values = args.slice(0, -1);
    return values.every(v => !!v);
  });

  // Helper pour formatter un nombre avec virgules
  Handlebars.registerHelper('formatNumber', function(value: number) {
    if (value === null || value === undefined) return '';
    return value.toString().replace('.', ',');
  });

  // Helper raw pour éviter l'échappement HTML
  Handlebars.registerHelper('raw', function(options) {
    return options.fn();
  });

  // Helper pour comparer avec plusieurs valeurs (utile pour les CCN)
  Handlebars.registerHelper('includesAny', function(str: string, ...values: any[]) {
    if (!str) return false;
    // Enlever le dernier argument (options de Handlebars)
    const searchValues = values.slice(0, -1);
    return searchValues.some(v => str.includes(v));
  });
}
