import type { MessageDocument } from "@hereconnect/types";
import { MyContext } from "../../types/myContext";
import { env } from "../../config/env";
import { qrDb, messagesDb } from "../../dbs";
import { secondsToISOString } from "../../utils/date";
import { escapeHtml } from "../../utils/escapeHtml";

const qrCodeMessageRegexp = /#qr(?<qr_code_uri>\S+)_c(?<chat>\S+)/;

/**
 * Middleware for handling replies to messages containing QR code identifiers.
 *
 * This middleware checks if a received message is a reply to another message
 * containing a specific pattern with QR code and chat identifiers. If the
 * pattern is found, it logs and processes the identifiers and sends a reply
 * acknowledging the response. If the pattern is not found or if the message
 * is not a reply, appropriate logs and responses are generated.
 *
 * @param ctx - The context object containing the message and other request details.
 * @param next - The next middleware function in the stack to be executed.
 */
export const forwardQrCodeMessageMiddleware = async (
  ctx: MyContext,
  next: () => Promise<void>,
) => {
  if (!ctx.has(":text")) {
    return next();
  }

  const m =
    ctx.msg.reply_to_message?.text?.match(qrCodeMessageRegexp) ||
    ctx.msg.text.match(qrCodeMessageRegexp);

  if (!m?.groups) {
    // console.log("m.groups is empty", m, m?.groups);
    // await ctx.reply(
    //   `не возможно обработать это сообщение.\nВыберете в телеграм ответить у любого сообщения QR-кода чтобы я его мог переслать в диалог.`,
    // );
    return next();
  }

  const { qr_code_uri, chat } = m.groups;

  const qrCodeDoc = await qrDb.get(`qr_code:${qr_code_uri}`).catch((error) => {
    if (error.name === "not_found") return;
    throw error;
  });

  if (!qrCodeDoc) {
    await ctx.reply(
      `Не возможно обработать это сообщение. QR-код с ID ${qr_code_uri} не найден.`,
      { reply_to_message_id: ctx.msg.message_id },
    );
    return next();
  }

  if (!ctx.userDoc) {
    await ctx.reply(
      `Не возможно обработать это сообщение. Вы не авторизованы`,
      {
        reply_to_message_id: ctx.msg.message_id,
      },
    );
    return next();
  }

  console.log(ctx.userDoc?.telegram_id, "!==", qrCodeDoc.telegram_id);

  if (ctx.userDoc?.user_uuid !== qrCodeDoc.user_uuid) {
    await ctx.reply(`Не возможно обработать это сообщение. Это не ваш QR-код`, {
      reply_to_message_id: ctx.msg.message_id,
    });
    return next();
  }

  const created_at = secondsToISOString(ctx.msg.date);
  const user_uuid = ctx.userDoc.user_uuid;
  const message: MessageDocument = {
    _id: `message:${qr_code_uri}:${chat}:${created_at}`,
    type: "message",
    qr_code_uri,
    chat,
    from: "owner",
    body: ctx.msg.text.trim(),
    user_uuid,
    created_at,
  };

  await ctx.replyWithChatAction("typing");
  await messagesDb.put(message);

  const hashTag = `#qr${qr_code_uri}_c${chat}`;
  const manageMessageUrl = `${env.APP_BASE_URL}/manage/qr/${qr_code_uri}/chat/${chat}#msg-${encodeURIComponent(created_at)}`;
  const text = `<i>сообщение отправлено <a href="${escapeHtml(manageMessageUrl)}">в диалог QR-кода <b>«${escapeHtml(qrCodeDoc.name)}»</b></a> ${escapeHtml(hashTag)}</i>`;

  // await ctx.react("⚡");
  await ctx.reply(text, {
    parse_mode: "HTML",
    link_preview_options: { is_disabled: true },
    reply_markup: { force_reply: true },
    reply_to_message_id: ctx.msg.message_id,
  });
};
