const { db } = require('../db/db-connect');
const logger = require('../utils/logger');
const globalService = require("../services/globalService");

async function createClient() {
  return await db.records.create('client', {});
}

async function getClient(id) {
  const criteria = {
    filter: `id='${id}'`,
  };
  
  return globalService.fetchInfoByCriteria("client", criteria);
}

/**
 * Récupère plusieurs clients en plusieurs requêtes batch (optimisation pour exports)
 * Découpe en chunks de 50 IDs pour éviter les filtres trop longs
 * SDK 0.7.x : getFullList(collection, batchSize, options)
 * @param {string[]} clientIds - Tableau d'IDs de clients
 * @returns {Map<string, Object>} - Map des clients par ID
 */
async function getClientsBatch(clientIds) {
  const clientMap = new Map();
  if (!clientIds || clientIds.length === 0) return clientMap;

  // Filtrer les IDs valides et uniques
  const uniqueIds = [...new Set(clientIds.filter(id => id && typeof id === 'string'))];
  if (uniqueIds.length === 0) return clientMap;

  // Découper en chunks de 50 pour éviter les filtres trop longs
  const CHUNK_SIZE = 50;
  const chunks = [];
  for (let i = 0; i < uniqueIds.length; i += CHUNK_SIZE) {
    chunks.push(uniqueIds.slice(i, i + CHUNK_SIZE));
  }

  // Traiter chaque chunk
  for (const chunk of chunks) {
    try {
      // Construire le filtre OR pour ce chunk
      const filter = chunk.map(id => `id = "${id}"`).join(" || ");
      
      // SDK 0.7.x : getFullList(collection, batchSize, options)
      const clients = await db.records.getFullList("client", 500, {
        filter: filter,
      });

      // Ajouter à la map
      clients.forEach(client => {
        if (client && client.id) {
          clientMap.set(client.id, client);
        }
      });
    } catch (err) {
      logger.log("warn", `Erreur récupération clients chunk (${chunk.length} IDs):`, err?.message || String(err));
    }
  }

  return clientMap;
}

module.exports = {
    createClient,
    getClient,
    getClientsBatch,
};