/**
 * Real Data Elements Helper
 *
 * Initialise et configure les éléments qui utilisent des données réelles WooCommerce
 *
 * Liste des éléments RealData:
 * - woocommerce_order_date: date de la commande (test: date actuelle)
 * - customer_info: infos client (test: données fictives)
 * - product_table: tableau des produits (test: produits fictifs)
 * - company_info: infos entreprise (EXCEPTION: toujours vraies)
 *
 * @module utils/RealDataElementsHelper
 * @version 1.0.0
 */

import type {
  CustomerInfoElement,
  ProductTableElement,
  CompanyInfoElement,
  WoocommerceOrderDateElement,
  BaseElement,
  Element,
} from "../types/elements";

/**
 * Types d'éléments qui récupèrent des données réelles
 */
const REAL_DATA_ELEMENT_TYPES = [
  "woocommerce_order_date",
  "customer_info",
  "product_table",
  "company_info",
];

/**
 * Valeurs fictives par défaut pour chaque type d'élément RealData
 */
const DEFAULT_TEST_VALUES: Record<string, unknown> = {
  woocommerce_order_date: new Date().toLocaleDateString("fr-FR"),
  customer_info: {
    name: "Jean Dupont",
    email: "jean@example.com",
    phone: "+33 1 23 45 67 89",
  },
  product_table: [
    { name: "Produit 1", sku: "SKU-001", quantity: 2, price: 29.99 },
    { name: "Produit 2", sku: "SKU-002", quantity: 1, price: 49.99 },
  ],
  company_info: {
    name: "Ma Société SAS",
    address: "456 Avenue du Commerce",
    phone: "+33 2 34 56 78 90",
  },
};

/**
 * Mapping des clés réelles WooCommerce pour chaque élément RealData
 */
const REAL_DATA_KEYS: Record<string, string> = {
  woocommerce_order_date: "orderDate",
  customer_info: "customerName", // Récupère tout le customer_info via fallback
  product_table: "products",
  company_info: "companyName", // Récupère tout le company_info via fallback
};

/**
 * Vérifie si un type d'élément est un RealDataElement
 */
export function isRealDataElementType(type: string): boolean {
  return REAL_DATA_ELEMENT_TYPES.includes(type);
}

/**
 * Configure un élément pour qu'il soit un RealDataElement
 *
 * Ajoute les propriétés nécessaires:
 * - isRealDataElement: true
 * - defaultTestValue: valeur fictive par défaut
 * - realDataKey: clé de récupération des données réelles
 */
export function configureRealDataElement<T extends Element>(
  element: T,
  type: string = element.type,
): T {
  if (!isRealDataElementType(type)) {
    return element;
  }

  // ✅ Better approach: create new object keeping all properties
  const configured = { ...element } as T;

  // Add RealData properties
  (configured as any).isRealDataElement = true;
  (configured as any).defaultTestValue = DEFAULT_TEST_VALUES[type];
  (configured as any).realDataKey = REAL_DATA_KEYS[type];

  return configured;
}

/**
 * Configure tous les éléments RealData dans une liste
 */
export function configureRealDataElements(elements: Element[]): Element[] {
  return elements.map((el) => {
    if (isRealDataElementType(el.type) && !el.isRealDataElement) {
      return configureRealDataElement(el);
    }
    return el;
  });
}

/**
 * Obtient le type d'élément pour une icône/label dans l'UI
 */
export function getRealDataElementLabel(type: string): string {
  const labels: Record<string, string> = {
    woocommerce_order_date: "📅 Date de commande",
    customer_info: "👤 Informations client",
    product_table: "📊 Tableau des produits",
    company_info: "🏢 Informations société",
  };

  return labels[type] || type;
}

/**
 * Filtre les éléments RealData avec données réelles (aperçu)
 * vs éléments de l'éditeur
 */
export function filterRealDataElements(elements: Element[]): Element[] {
  return elements.filter((el) => isRealDataElementType(el.type));
}

/**
 * Obtient la description pour afficher dans l'UI
 */
export function getRealDataElementDescription(type: string): string {
  const descriptions: Record<string, string> = {
    woocommerce_order_date: "Récupère la date de commande depuis WooCommerce",
    customer_info: "Affiche les infos client (nom, email, adresse, etc.)",
    product_table: "Affiche le tableau des produits commandés",
    company_info: "EXCEPTION: Affiche toujours les vraies infos société",
  };

  return descriptions[type] || "";
}
