const fetch = require('node-fetch');
const db    = require('./db');

const IG_API       = 'https://graph.instagram.com/v21.0';
const DEEPSEEK_KEY = process.env.DEEPSEEK_API_KEY;

const DEFAULT_MSG_PERSONA =
  'Você é uma assistente humanizada no Instagram. Responda de forma natural, simpática e breve (máximo 3 linhas). Use linguagem informal e acolhedora. Nunca mencione que é uma IA. Se não souber a resposta, diga que vai verificar e retornar em breve.';

const DEFAULT_CMT_PERSONA =
  'Você é uma assistente humanizada respondendo comentários no Instagram. Responda de forma natural, simpática e muito breve (1-2 linhas). Use linguagem informal. Nunca mencione que é uma IA.';

// ── Histórico por sender (máx 10 trocas, TTL 30 min) ─────────────────────────
const histories = new Map();
const HISTORY_TTL = 30 * 60 * 1000;

function getHistory(key) {
  const entry = histories.get(key);
  if (!entry || Date.now() - entry.ts > HISTORY_TTL) {
    histories.set(key, { ts: Date.now(), msgs: [] });
  } else {
    entry.ts = Date.now();
  }
  return histories.get(key).msgs;
}

function pushHistory(key, role, content) {
  const msgs = getHistory(key);
  msgs.push({ role, content });
  if (msgs.length > 20) msgs.splice(0, 2);
}

// ── DeepSeek ──────────────────────────────────────────────────────────────────
async function askDeepSeek(histKey, persona, userText) {
  if (!DEEPSEEK_KEY) throw new Error('DEEPSEEK_API_KEY não configurado');

  pushHistory(histKey, 'user', userText);

  const r = await fetch('https://api.deepseek.com/chat/completions', {
    method:  'POST',
    headers: { Authorization: `Bearer ${DEEPSEEK_KEY}`, 'Content-Type': 'application/json' },
    body: JSON.stringify({
      model: 'deepseek-chat',
      max_tokens: 200,
      messages: [
        { role: 'system', content: persona },
        ...getHistory(histKey)
      ]
    })
  });

  const data = await r.json();
  const reply = data.choices?.[0]?.message?.content?.trim();
  if (!reply) throw new Error('Resposta vazia do DeepSeek: ' + JSON.stringify(data));

  pushHistory(histKey, 'assistant', reply);
  return reply;
}

// ── Enviar DM ─────────────────────────────────────────────────────────────────
async function sendDM(token, igUserId, recipientId, text) {
  const r = await fetch(`${IG_API}/${igUserId}/messages?access_token=${token}`, {
    method:  'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ recipient: { id: recipientId }, message: { text } })
  });
  const data = await r.json();
  if (data.error) throw new Error(JSON.stringify(data.error));
}

// ── Responder comentário ──────────────────────────────────────────────────────
async function replyComment(token, commentId, text) {
  const r = await fetch(`${IG_API}/${commentId}/replies`, {
    method:  'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body:    new URLSearchParams({ message: text, access_token: token })
  });
  const data = await r.json();
  if (data.error) throw new Error(JSON.stringify(data.error));
}

// IDs de comentários já respondidos (anti-loop)
const repliedComments = new Set();

// ── Processar evento webhook ──────────────────────────────────────────────────
async function processWebhookEvent(body) {
  if (body.object !== 'instagram') return;

  for (const entry of (body.entry || [])) {
    const igUserId = entry.id;

    const user = db.prepare('SELECT * FROM users WHERE ig_user_id = ?').get(igUserId);
    if (!user || !user.ig_token) {
      console.log(`[bot] sem usuário para ig_user_id=${igUserId}`);
      continue;
    }

    // ── DMs ──────────────────────────────────────────────────────────────
    if (user.bot_msg_enabled) {
      for (const event of (entry.messaging || [])) {
        const senderId = event.sender?.id;
        const text     = event.message?.text;

        if (!senderId || !text || senderId === igUserId) continue;

        console.log(`[bot:dm] @${user.ig_username} ← ${senderId}: ${text}`);
        try {
          const persona = user.bot_msg_persona || DEFAULT_MSG_PERSONA;
          const reply   = await askDeepSeek(`msg_${igUserId}_${senderId}`, persona, text);
          await sendDM(user.ig_token, igUserId, senderId, reply);
          console.log(`[bot:dm] enviado: ${reply}`);
        } catch (e) {
          console.error(`[bot:dm] erro:`, e.message);
          try { await sendDM(user.ig_token, igUserId, senderId, 'Olá! No momento estou com dificuldades técnicas. Tente novamente em instantes 🙏'); } catch {}
        }
      }
    }

    // ── Comentários ──────────────────────────────────────────────────────
    if (user.bot_cmt_enabled) {
      for (const change of (entry.changes || [])) {
        if (change.field !== 'comments') continue;

        const val       = change.value || {};
        const commentId = val.id;
        const fromId    = val.from?.id;
        const text      = val.text;

        if (!commentId || !text) continue;
        if (val.parent_id) continue;                              // só comentários raiz
        if (fromId === igUserId) continue;                        // eco próprio por ID
        if (val.from?.username === user.ig_username) continue;   // eco próprio por username
        if (repliedComments.has(commentId)) continue;

        repliedComments.add(commentId);
        if (repliedComments.size > 1000) repliedComments.clear();

        console.log(`[bot:cmt] @${user.ig_username} ← @${val.from?.username}: ${text}`);
        try {
          const persona = user.bot_cmt_persona || DEFAULT_CMT_PERSONA;
          const reply   = await askDeepSeek(`cmt_${igUserId}_${fromId}`, persona, text);
          await replyComment(user.ig_token, commentId, reply);
          console.log(`[bot:cmt] enviado: ${reply}`);
        } catch (e) {
          console.error(`[bot:cmt] erro:`, e.message);
        }
      }
    }
  }
}

module.exports = { processWebhookEvent };
