'use strict';
const logger = require('../utils/logger');
/**
 * pdfInsumosService.js
 * Parsea un PDF de insumos/costos y devuelve filas estructuradas
 * para que el usuario revise ANTES de escribir en SoftRestaurant.
 *
 * Nunca escribe en SR directamente — eso lo hace inventarioService.crearInsumo().
 */

const UNIDADES_VALIDAS = ['KGS','PZA','LT','ML','GALON','CAJA','OZ','GR','TON','BOLSA','PAQ','BOT','LATA'];

/**
 * Intenta parsear texto libre de un PDF de costos/insumos.
 * Soporta dos formatos:
 *   1. Tabla con columnas: Clave | Descripción | Costo | Unidad
 *   2. Lista libre:  "ACEITE DE OLIVA  45.00  KGS"
 */
function parsearTextoInsumos(texto) {
  const lineas = texto
    .split(/\r?\n/)
    .map(l => l.trim())
    .filter(l => l.length > 2);

  const filas = [];
  const errores = [];

  // ── Modo tabla: detectar si hay encabezado estilo SR ──────────────────────
  const esTabla = lineas.some(l =>
    /\bCLAVE\b/i.test(l) || /\bDESCRIPCION\b/i.test(l) || /\bUNIDAD\b/i.test(l)
  );

  if (esTabla) {
    // Buscar filas con patrón: <clave alfanum>  <descripción>  <costo?>  <unidad?>
    for (const linea of lineas) {
      // Saltar encabezados
      if (/^(CLAVE|TABLA|TABLE|COLUMN|DESCRIPCION|INSUMO|UNIDAD|COSTO)/i.test(linea)) continue;
      if (/^\d+$/.test(linea)) continue; // solo números (índice)

      // Patrón: clave(6chars) descripción costo unidad
      const m = linea.match(/^([A-Z0-9]{3,10})\s+(.+?)\s+(\$?[\d,]+\.?\d*)\s+([A-Z]{2,6})\s*$/i);
      if (m) {
        const costo = parseFloat(m[3].replace(/[$,]/g, '')) || 0;
        filas.push({
          idinsumo:    normalizarClave(m[1]),
          descripcion: normalizarDesc(m[2]),
          unidad:      normalizarUnidad(m[4]),
          ultimo_costo: costo,
          estado: 'ok',
        });
        continue;
      }

      // Patrón sin clave: descripción + costo + unidad
      const m2 = linea.match(/^(.+?)\s+(\$?[\d,]+\.?\d*)\s+([A-Z]{2,6})\s*$/i);
      if (m2) {
        const costo = parseFloat(m2[2].replace(/[$,]/g, '')) || 0;
        filas.push({
          idinsumo:    generarClave(m2[1]),
          descripcion: normalizarDesc(m2[1]),
          unidad:      normalizarUnidad(m2[3]),
          ultimo_costo: costo,
          estado: 'revisar', // clave generada automáticamente
        });
      }
    }
  } else {
    // ── Modo lista libre: cada línea es un insumo ─────────────────────────
    for (const linea of lineas) {
      if (/^\d+$/.test(linea)) continue;
      if (linea.length < 3) continue;

      // "ACEITE DE OLIVA   45.00   KGS" o "Carne premium (180g)   45"
      const m = linea.match(/^(.+?)\s+(\$?[\d,]+\.?\d*)\s*([A-Z]{2,6})?\s*$/i);
      if (m) {
        const costo = parseFloat(m[2].replace(/[$,]/g, '')) || 0;
        const unidad = m[3] ? normalizarUnidad(m[3]) : 'KGS';
        filas.push({
          idinsumo:    generarClave(m[1]),
          descripcion: normalizarDesc(m[1]),
          unidad,
          ultimo_costo: costo,
          estado: 'revisar',
        });
      } else {
        // Solo descripción sin costo
        filas.push({
          idinsumo:    generarClave(linea),
          descripcion: normalizarDesc(linea),
          unidad:      'KGS',
          ultimo_costo: 0,
          estado: 'incompleto',
        });
        errores.push(`Sin costo detectado: "${linea}"`);
      }
    }
  }

  return {
    filas: dedupFilas(filas),
    errores,
    total: filas.length,
    requieren_revision: filas.filter(f => f.estado !== 'ok').length,
  };
}

// ─── Helpers ──────────────────────────────────────────────────────────────────
function normalizarClave(s) {
  return s.trim().toUpperCase().replace(/[^A-Z0-9]/g, '').substring(0, 10);
}

function normalizarDesc(s) {
  return s.trim().toUpperCase()
    .replace(/\s+/g, ' ')
    .replace(/[^\wÁÉÍÓÚÑÜáéíóúñü\s\(\)\/\-\.]/g, '')
    .substring(0, 60);
}

function normalizarUnidad(s) {
  if (!s) return 'KGS';
  const up = s.trim().toUpperCase();
  const map = {
    'KG': 'KGS', 'KILO': 'KGS', 'KILOS': 'KGS',
    'PIEZA': 'PZA', 'PIEZAS': 'PZA', 'PZ': 'PZA',
    'LITRO': 'LT', 'LITROS': 'LT', 'L': 'LT',
    'GRAMO': 'GR', 'GRAMOS': 'GR', 'G': 'GR',
    'ONZA': 'OZ', 'ONZAS': 'OZ',
  };
  return map[up] || (UNIDADES_VALIDAS.includes(up) ? up : 'KGS');
}

function generarClave(desc) {
  // Genera clave de 6 chars: primeras 3 letras del grupo + 3 dígitos
  const base = desc.trim().toUpperCase().replace(/[^A-Z0-9]/g, '').substring(0, 3);
  const num  = String(Math.floor(Math.random() * 900) + 100);
  return (base + num).substring(0, 6).padEnd(6, '0');
}

function dedupFilas(filas) {
  const seen = new Set();
  return filas.filter(f => {
    const key = f.descripcion;
    if (seen.has(key)) return false;
    seen.add(key);
    return true;
  });
}

module.exports = { parsearTextoInsumos };
