import { InlineKeyboard } from 'grammy';
import { config } from '../config';
import { prisma } from '../db/client';
import { getSupportBot } from '../tg/supportBot';
import { getRedis, REDIS_KEYS } from '../redis';
import type { SupportMessage, SupportSession } from '@prisma/client';

function esc(text: string): string {
  return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

function formatDate(d: Date): string {
  return d.toLocaleString('ru-RU', { timeZone: 'Europe/Warsaw' });
}

export async function notifyUserMessage(
  session: SupportSession,
  message: SupportMessage,
): Promise<void> {
  const bot = getSupportBot();
  if (!bot || config.supportTg.chatIds.length === 0) return;

  const shortId = session.id.slice(0, 8);
  const visitor = session.visitorUuid ? session.visitorUuid.slice(0, 8) : '—';
  const page = session.pageUrl ? esc(session.pageUrl.slice(0, 120)) : '—';

  const text =
    `💬 <b>Поддержка #${esc(shortId)}</b>\n` +
    `👤 Визитор: <code>${esc(visitor)}</code>\n` +
    `📄 Страница: <code>${page}</code>\n\n` +
    `📝 ${esc(message.text)}`;

  const kb = new InlineKeyboard().text(
    '📜 Посмотреть историю чата',
    `support:history:${session.id}`,
  );

  const redis = getRedis();
  for (const chatId of config.supportTg.chatIds) {
    try {
      const sent = await bot.api.sendMessage(chatId, text, {
        parse_mode: 'HTML',
        reply_markup: kb,
      });
      await redis.set(
        REDIS_KEYS.supportTgMessage(sent.message_id),
        session.id,
        'EX',
        60 * 60 * 24 * 14,
      );
      await prisma.supportMessage.update({
        where: { id: message.id },
        data: { telegramMessageId: BigInt(sent.message_id) },
      });
    } catch (err) {
      console.error('[support-tg] notify error:', (err as Error).message);
    }
  }
}

export function formatSupportHistory(
  session: SupportSession,
  messages: SupportMessage[],
): string {
  const header =
    `📜 <b>История чата #${esc(session.id.slice(0, 8))}</b>\n` +
    `👤 Визитор: <code>${esc(session.visitorUuid?.slice(0, 8) ?? '—')}</code>\n` +
    `📄 ${esc(session.pageUrl?.slice(0, 120) ?? '—')}\n` +
    `🕐 ${formatDate(session.createdAt)}\n\n`;

  if (messages.length === 0) {
    return header + '<i>Нет сообщений.</i>';
  }

  const lines = messages.map((m) => {
    const who = m.role === 'agent' ? '👨‍💼 Менеджер' : '👤 Клиент';
    return `${who} · ${formatDate(m.createdAt)}\n${esc(m.text)}`;
  });

  const body = lines.join('\n\n');
  const maxLen = 3800;
  if (header.length + body.length <= maxLen) {
    return header + body;
  }
  return header + body.slice(0, maxLen - header.length - 20) + '\n\n…';
}
