const express = require('express');
const fetch = require('node-fetch');

const app = express();
app.use(express.json());

const NAN_API_KEY = process.env.NAN_API_KEY || 'sk-gJ8OWbZVGeWy9ns_H00cxA';
const NAN_BASE_URL = process.env.NAN_BASE_URL || 'https://api.nan.builders/v1';
const WACRM_URL = process.env.WACRM_URL || 'http://localhost:3000';
const WACRM_API_KEY = process.env.WACRM_API_KEY || 'wacrm_live_ffac5531d76645acb239dba71ace6d1c';

const SKEEN_SYSTEM_PROMPT = `Eres Sofia, la asistente virtual de SKEEN Derma Experts, una clínica dermatológica en Playas de Rosarito, BC, México.

Tu personalidad: cálida, profesional, empática y eficiente.
Idioma: Español (México).

Datos de la clínica:
- Nombre: SKEEN Derma Experts
- Dirección: Blvd. Popotla 123, Playas de Rosarito, BC, México
- Horario: Lun-Vie 9:00-18:00, Sáb 9:00-14:00
- Teléfono: +52 (664) 123-4567

Límites importantes:
- NO diagnosticar condiciones médicas.
- NO recomendar medicamentos específicos.
- SIEMPRE sugerir consulta presencial para evaluación.
- Máximo 3 párrafos por mensaje.
- Máximo 2 emojis por mensaje.

Servicios principales:
- Consulta Dermatológica General — $800 MXN, 30 min
- Consulta de Valoración Gratuita — 15 min
- Tratamiento Facial para Acné — $1,500 MXN, 60 min
- Peel Químico — $1,500 MXN, 30 min
- Depilación Láser — desde $500 MXN por zona, 15-60 min
- Tratamiento Anti-Edad — $2,500 MXN, 60 min

Cuando el usuario pregunte por servicios, dales información general y ofrece agendar una consulta de valoración.
Cuando quiera agendar, pregunta tipo de servicio y ofrece opciones de horario.
Si escribe AGENTE, HUMANO, ESPECIALISTA o DOCTOR, responde: "Te conecto con un especialista enseguida. Espera un momento 💙"`;

async function callNanBuilders(messages) {
  const response = await fetch(`${NAN_BASE_URL}/chat/completions`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${NAN_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      model: 'deepseek-v4-flash',
      messages,
      temperature: 0.7,
      max_tokens: 500,
    }),
  });

  if (!response.ok) {
    const error = await response.text();
    throw new Error(`Nan API error: ${response.status} ${error}`);
  }

  const data = await response.json();
  return data.choices[0]?.message?.content || 'Lo siento, no pude procesar tu mensaje.';
}

async function sendWacrmMessage(to, text, simulate = false) {
  const endpoint = simulate
    ? `${WACRM_URL}/api/v1/messages/simulate`
    : `${WACRM_URL}/api/v1/messages`;

  const response = await fetch(endpoint, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${WACRM_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ to, type: 'text', text }),
  });

  if (!response.ok) {
    const error = await response.text();
    throw new Error(`WACRM send error: ${response.status} ${error}`);
  }

  return await response.json();
}

async function sendWacrmMessageWithFallback(to, text) {
  try {
    return await sendWacrmMessage(to, text, false);
  } catch (error) {
    const msg = error.message || '';
    // If Meta is not connected, fall back to simulated injection so the
    // demo/development flow still works end-to-end.
    if (msg.includes('Meta API error') || msg.includes('Invalid OAuth')) {
      console.warn('[Bridge] Meta send failed, falling back to simulate endpoint');
      return await sendWacrmMessage(to, text, true);
    }
    throw error;
  }
}

app.get('/health', (req, res) => {
  res.json({ status: 'ok', service: 'skeen-hermes-webhook-bridge' });
});

app.post('/webhook/wacrm', async (req, res) => {
  try {
    // WACRM envía el payload con estructura { id, event, occurred_at, account_id, data }
    const payload = req.body;
    const eventType = payload.event;
    const data = payload.data || {};

    console.log(`[WACRM] Webhook recibido: ${eventType}`, JSON.stringify(data).substring(0, 200));

    // Solo procesar mensajes entrantes
    if (eventType !== 'message.received') {
      return res.json({ status: 'ignored', event: eventType });
    }

    const from = data.contact_phone || data.from;
    const text = data.text;
    const conversation_id = data.conversation_id;
    const contact_id = data.contact_id;

    if (!from || !text) {
      return res.status(400).json({ error: 'Missing from or text', received: payload });
    }

    const messages = [
      { role: 'system', content: SKEEN_SYSTEM_PROMPT },
      { role: 'user', content: text },
    ];

    const reply = await callNanBuilders(messages);

    console.log(`[Sofia] Respuesta: ${reply.substring(0, 100)}...`);

    try {
      await sendWacrmMessageWithFallback(from, reply);
    } catch (wacrmError) {
      console.error('Error enviando a WACRM:', wacrmError.message);
    }

    res.json({ status: 'success', reply, from, conversation_id, contact_id });
  } catch (error) {
    console.error('Error procesando webhook:', error);
    res.status(500).json({ status: 'error', message: error.message });
  }
});

const PORT = process.env.PORT || 8090;
app.listen(PORT, '0.0.0.0', () => {
  console.log(`SKEEN Hermes Webhook Bridge escuchando en http://0.0.0.0:${PORT}`);
  console.log(`Health: http://localhost:${PORT}/health`);
  console.log(`Webhook: http://localhost:${PORT}/webhook/wacrm`);
});
