import { ImapFlow } from 'imapflow';
import { simpleParser } from 'mailparser';

// Подключается к IMAP, перебирает непрочитанные письма INBOX, парсит каждое,
// вызывает onMessage(email). Если onMessage вернул true — письмо помечается \Seen
// (чтобы не обрабатывать повторно). limit ограничивает пачку за один опрос.
export async function processInbox({ host, port, secure, user, pass }, onMessage, limit = 25) {
  const client = new ImapFlow({
    host,
    port: Number(port) || 993,
    secure: secure !== false && secure !== 0,
    auth: { user, pass },
    logger: false,
    socketTimeout: 20000,
  });

  let processed = 0;
  await client.connect();
  const lock = await client.getMailboxLock('INBOX');
  try {
    const uids = (await client.search({ seen: false }, { uid: true })) || [];
    // берём самые свежие, но не больше limit
    const batch = uids.slice(-limit);
    for (const uid of batch) {
      const msg = await client.fetchOne(uid, { source: true }, { uid: true });
      if (!msg || !msg.source) continue;

      const parsed = await simpleParser(msg.source);
      const fromObj = parsed.from?.value?.[0] || {};
      const text = (parsed.text || '').slice(0, 20000);

      const email = {
        uid,
        messageId: parsed.messageId || `uid-${uid}-${Date.now()}`,
        from: fromObj.address || '',
        fromName: fromObj.name || '',
        subject: parsed.subject || '',
        text,
      };

      let handled = false;
      try {
        handled = await onMessage(email);
      } catch (err) {
        // не помечаем прочитанным — попробуем в следующий опрос
        console.error('[imap] onMessage error:', err.message);
      }
      if (handled) {
        await client.messageFlagsAdd({ uid }, ['\\Seen'], { uid: true });
        processed++;
      }
    }
  } finally {
    lock.release();
  }
  await client.logout();
  return processed;
}
