'use strict';

const svc    = require('../services/inventarioService');
const pdfSvc = require('../services/pdfInsumosService');
const smartImportSvc = require('../services/intelligentImportService');
const { noNulls } = require('../utils/noNulls');
const { hasPermission } = require('../middleware/permissions');

// ── Helpers ───────────────────────────────────────────────────────────────────
function ok(res, data)  { res.json({ ok: true,  data: noNulls(data) }); }
function err(res, e, status = 500) {
  res.status(status).json({ ok: false, error: e?.message || String(e) });
}

function canWriteSoftRestaurant(req) {
  return hasPermission(req, 'softrestaurant.write_controlled');
}

// ── Existentes ────────────────────────────────────────────────────────────────
async function getAlmacenes(req, res, next) {
  try { ok(res, await svc.getAlmacenes()); } catch(e) { next(e); }
}
async function getExistencias(req, res, next) {
  try {
    const { idalmacen } = req.query;
    ok(res, await svc.getExistencias(idalmacen || null));
  } catch(e) { next(e); }
}
async function getAlertas(req, res, next) {
  try { ok(res, await svc.getAlertas()); } catch(e) { next(e); }
}
async function getMovimientos(req, res, next) {
  try {
    const { idalmacen, dias = 7, page = 1, pageSize = 100 } = req.query;
    ok(res, await svc.getMovimientos(idalmacen||null, +dias, +page, +pageSize));
  } catch(e) { next(e); }
}
async function getConsumoEstimado(req, res, next) {
  try {
    const { idturno, fecha } = req.query;
    ok(res, await svc.getConsumoEstimado(idturno||null, fecha||null));
  } catch(e) { next(e); }
}
async function getResumen(req, res, next) {
  try { ok(res, await svc.getResumenInventario()); } catch(e) { next(e); }
}

// ── Catálogo de insumos ───────────────────────────────────────────────────────
async function getInsumosCatalogo(req, res, next) {
  try { ok(res, await svc.getInsumosCatalogo()); } catch(e) { next(e); }
}
async function getInsumo(req, res, next) {
  try {
    const item = await svc.getInsumo(req.params.idinsumo);
    if (!item) return res.status(404).json({ ok: false, error: 'Insumo no encontrado' });
    ok(res, item);
  } catch(e) { next(e); }
}
async function crearInsumo(req, res, next) {

  // FIX-6: Escrituras en SR solo para dueno/admin o api_key local
  const esEscritor = canWriteSoftRestaurant(req);
  if (!esEscritor) return res.status(403).json({ ok: false, error: 'Se requiere rol admin o dueño para modificar SoftRestaurant' });
  try { ok(res, await svc.crearInsumo(req.body)); } catch(e) { err(res, e, 400); }
}
async function actualizarInsumo(req, res, next) {

  // FIX-6: Escrituras en SR solo para dueno/admin o api_key local
  const esEscritor = canWriteSoftRestaurant(req);
  if (!esEscritor) return res.status(403).json({ ok: false, error: 'Se requiere rol admin o dueño para modificar SoftRestaurant' });
  try { ok(res, await svc.actualizarInsumo(req.params.idinsumo, req.body)); } catch(e) { err(res, e, 400); }
}

// ── Productos y Recetas ───────────────────────────────────────────────────────
async function getProductosCatalogo(req, res, next) {
  try { ok(res, await svc.getProductosCatalogo()); } catch(e) { next(e); }
}
async function getRecetaProducto(req, res, next) {
  try { ok(res, await svc.getRecetaProducto(req.params.idproducto)); } catch(e) { next(e); }
}
async function guardarReceta(req, res, next) {

  // FIX-6: Escrituras en SR solo para dueno/admin o api_key local
  const esEscritor = canWriteSoftRestaurant(req);
  if (!esEscritor) return res.status(403).json({ ok: false, error: 'Se requiere rol admin o dueño para modificar SoftRestaurant' });
  try {
    const { lines } = req.body || {};
    if (!Array.isArray(lines)) return res.status(400).json({ ok: false, error: 'lines[] requerido' });
    ok(res, await svc.guardarReceta(req.params.idproducto, lines));
  } catch(e) { err(res, e, 400); }
}

// ── Food cost + snapshot ──────────────────────────────────────────────────────
async function getFoodCostEnVivo(req, res, next) {
  try { ok(res, await svc.getFoodCostEnVivo()); } catch(e) { next(e); }
}
async function getSnapshotEnVivo(req, res, next) {
  try { ok(res, await svc.getSnapshotEnVivo()); } catch(e) { next(e); }
}

// ── Importar PDF ──────────────────────────────────────────────────────────────
// Recibe el texto ya extraído del PDF (el frontend lo extrae con pdf.js)
// O recibe base64 del PDF y lo parsea aquí.
// Nunca escribe en SR — devuelve las filas para revisión del usuario.
async function importarPdf(req, res) {
  try {
    const { texto, filas_confirmadas } = req.body || {};

    // MODO 1: Solo parsear texto → devolver preview para revisión (lectura — no requiere rol especial)
    if (texto && !filas_confirmadas) {
      const resultado = pdfSvc.parsearTextoInsumos(texto);
      return res.json({ ok: true, modo: 'preview', ...resultado });
    }

    // MODO 2: Usuario confirmó las filas → guardar en SR (requiere rol)
    if (Array.isArray(filas_confirmadas) && filas_confirmadas.length) {
      const esEscritor = canWriteSoftRestaurant(req);
      if (!esEscritor) return res.status(403).json({ ok: false, error: 'Se requiere rol admin o dueño para importar a SoftRestaurant' });
      const resultados = [];
      for (const fila of filas_confirmadas) {
        try {
          await svc.crearInsumo(fila);
          resultados.push({ idinsumo: fila.idinsumo, ok: true });
        } catch(e) {
          // Si ya existe, actualizar costo
          if (e.message && e.message.includes('duplicate')) {
            try {
              await svc.actualizarInsumo(fila.idinsumo, { ultimocosto: fila.ultimo_costo });
              resultados.push({ idinsumo: fila.idinsumo, ok: true, actualizado: true });
            } catch(e2) {
              resultados.push({ idinsumo: fila.idinsumo, ok: false, error: e2.message });
            }
          } else {
            resultados.push({ idinsumo: fila.idinsumo, ok: false, error: e.message });
          }
        }
      }
      const guardados = resultados.filter(r => r.ok).length;
      return res.json({ ok: true, modo: 'guardado', guardados, total: filas_confirmadas.length, resultados });
    }

    return res.status(400).json({ ok: false, error: 'Envía texto (para preview) o filas_confirmadas (para guardar)' });
  } catch(e) {
    res.status(500).json({ ok: false, error: e.message });
  }
}

async function previewImportInteligente(req, res) {
  try {
    const result = await smartImportSvc.previewSmartImport({
      file: req.file || null,
      text: req.body?.texto || req.body?.text || '',
      tipo: req.body?.tipo || 'inventario',
      options: { prefix: req.body?.prefijo || '' },
    });
    res.json({ ok: true, modo: 'preview', data: noNulls(result) });
  } catch(e) {
    err(res, e, 400);
  }
}

async function aplicarImportInteligente(req, res) {
  try {
    if (!canWriteSoftRestaurant(req)) {
      return res.status(403).json({ ok: false, error: 'Se requiere rol admin o dueno para importar a SoftRestaurant' });
    }
    const result = await smartImportSvc.applySmartImport({
      tipo: req.body?.tipo || 'inventario',
      filas: req.body?.filas || [],
      tablas: req.body?.tablas || [],
      catalog_plan: req.body?.catalog_plan || null,
    });
    res.json({ ok: true, modo: 'guardado', data: noNulls(result) });
  } catch(e) {
    err(res, e, 400);
  }
}

async function previewRecetasInteligentes(req, res) {
  try {
    const productos = req.body?.productos || req.body?.filas || req.body?.rows || [];
    if (!Array.isArray(productos) || !productos.length) {
      return res.status(400).json({ ok: false, error: 'productos[] o filas[] requerido' });
    }

    const insumos = await svc.getInsumosCatalogo();
    const result = smartImportSvc.buildRecipeSuggestionPlan(productos, insumos, {
      idempresa: req.body?.idempresa || req.body?.catalog_plan?.idempresa || null,
    });

    res.json({ ok: true, modo: 'recetas_preview', data: noNulls(result) });
  } catch(e) {
    err(res, e, 400);
  }
}

async function descargarPlantillaSr(req, res) {
  try {
    const buffer = await smartImportSvc.buildSoftRestaurantCatalogTemplate();
    res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    res.setHeader('Content-Disposition', 'attachment; filename="ARKHON-Plantilla-Catalogos-SoftRestaurant.xlsx"');
    res.send(Buffer.from(buffer));
  } catch(e) {
    err(res, e, 500);
  }
}

async function exportarNexusZip(req, res) {
  try {
    const buffer = await smartImportSvc.buildNexusExportZip({
      tipo: req.body?.tipo || 'menu',
      filas: req.body?.filas || [],
      nexus: req.body?.nexus || null,
      catalog_plan: req.body?.catalog_plan || null,
    });
    res.setHeader('Content-Type', 'application/zip');
    res.setHeader('Content-Disposition', 'attachment; filename="ARKHON-NEXUS-Catalogos.zip"');
    res.send(Buffer.from(buffer));
  } catch(e) {
    err(res, e, 400);
  }
}

module.exports = {
  getAlmacenes, getExistencias, getAlertas, getMovimientos,
  getConsumoEstimado, getResumen,
  getInsumosCatalogo, getInsumo, crearInsumo, actualizarInsumo,
  getProductosCatalogo, getRecetaProducto, guardarReceta,
  getFoodCostEnVivo, getSnapshotEnVivo,
  importarPdf,
  previewImportInteligente, aplicarImportInteligente, previewRecetasInteligentes, descargarPlantillaSr, exportarNexusZip,
};
