'use strict';

const express = require('express');
const router  = express.Router();
const { limiterIA } = require('../middleware/rateLimiter');
const { buildAdvancedContext } = require('../services/advancedAnalysisService');
const { callSelectedAi } = require('../services/aiProvider');

function stripEmoji(text) {
  return String(text || '')
    .replace(/[\u2600-\u27BF]/g, '')
    .replace(/\p{Extended_Pictographic}/gu, '')
    .trim();
}

router.post('/analizar', limiterIA, express.json({ limit: '512kb' }), async (req, res, next) => {
  try {
    const {
      contexto,
      tipo,
      historico = true,
      dias_historico,
      inicio,
      fin,
      prevInicio,
      prevFin,
      anioActual,
      anioAnterior,
      idgrupo,
      categoria,
      limite,
    } = req.body || {};

    if (contexto !== undefined && typeof contexto !== 'string') {
      return res.status(400).json({ ok: false, error: 'Contexto requerido.' });
    }

    let contextoFinal = contexto || '';
    let contextoMeta = null;
    if (historico !== false && tipo !== 'urgente') {
      const historicoContext = await buildAdvancedContext({
        contexto,
        days: dias_historico || 90,
        inicio,
        fin,
        prevInicio,
        prevFin,
        anioActual,
        anioAnterior,
        idgrupo,
        categoria,
        limite,
      });
      contextoFinal = historicoContext.texto;
      contextoMeta = historicoContext.meta;
    } else if (!contextoFinal) {
      const historicoContext = await buildAdvancedContext({
        days: dias_historico || 30,
        inicio,
        fin,
        prevInicio,
        prevFin,
        anioActual,
        anioAnterior,
        idgrupo,
        categoria,
        limite,
      });
      contextoFinal = historicoContext.texto;
      contextoMeta = historicoContext.meta;
    }

    const sistemaPrompt = tipo === 'urgente'
      ? `Eres un consultor de restaurantes experto en operaciones.
Analiza los datos y genera SOLO una lista de alertas criticas y acciones urgentes para las proximas 2 horas.
Se directo y especifico. Usa formato markdown con listas (-).
No uses emojis, iconos ni pictogramas.
Maximo 400 palabras.`
      : `Actua como director de analitica y consultor senior de rentabilidad para restaurantes.
Entrega un diagnostico ejecutivo verificable, basado exclusivamente en los datos proporcionados.

Estructura obligatoria:
## Resumen ejecutivo
Tres conclusiones maximas con magnitud, comparativo y nivel de confianza.
## Scorecard de KPIs
Incluye venta, tickets, ticket promedio, mezcla de canales, descuentos, cortesias, cancelaciones y cobertura de datos. Usa los KPIs calculados por ARKHON sin recalcularlos.
## Hallazgos y causas probables
Separa HECHOS, CALCULOS e INFERENCIAS. No confundas correlacion con causalidad.
## Riesgos y oportunidades
Prioriza por impacto economico y urgencia. Indica evidencia y confianza alta, media o baja.
## Plan de accion
De 3 a 5 acciones. Para cada una incluye responsable sugerido, horizonte (hoy, 7 dias o 30 dias), impacto esperado y KPI de verificacion.
## Vigilancia operativa
Define de 2 a 4 umbrales concretos que deban generar alerta.

Diagnostica explicitamente si hay falta de sincronizacion, cobertura insuficiente, filtro temporal o cero actividad real. Si no hay evidencia suficiente, dilo. Usa markdown, numeros y nombres reales. Sin emojis. Maximo 900 palabras.`;

    const ai = await callSelectedAi({
      system: sistemaPrompt,
      input: contextoFinal,
      maxTokens: tipo === 'urgente' ? 1200 : 2600,
      reasoningEffort: tipo === 'urgente' ? 'medium' : 'high',
    });
    const texto = stripEmoji(ai.text || '');

    res.json({ ok: true, data: { texto, tipo, contexto_meta: contextoMeta, provider: ai.provider, model: ai.model } });
  } catch (err) {
    if (err.status === 503) return res.status(503).json({ ok: false, error: err.message, provider: err.provider || null });
    if (err.status) return res.status(502).json({ ok: false, error: err.message, provider: err.provider || null });
    next(err);
  }
});

module.exports = router;
