import { deleteQRCode, getQRCodeByUri } from "../../api/qrCodes";
import { MyContext } from "../../types/myContext";
import { generateQRCodeImage } from "../../services/qrGenerator";
import { InputFile } from "grammy";

export async function qrCodeActions(ctx: MyContext) {
  const data = ctx.callbackQuery?.data;

  if (!data) {
    await ctx.answerCallbackQuery({ text: "Неверные данные действия." });
    return;
  }

  const parts = data.split(":");

  if (parts.length < 3) {
    await ctx.answerCallbackQuery({ text: "Неверный формат данных действия." });
    return;
  }

  const action = parts[1];
  const qrCodeUri = parts[2];

  // Получаем документ QR-кода
  let qrCode;
  try {
    qrCode = await getQRCodeByUri(qrCodeUri);
    if (!qrCode) {
      await ctx.answerCallbackQuery({ text: "QR-код не найден." });
      return;
    }
  } catch (error) {
    console.error("Ошибка при получении QR-кода:", qrCodeUri, error);
    await ctx.answerCallbackQuery({ text: "Ошибка при обработке QR-кода." });
    return;
  }

  // Обработка действия
  switch (action) {
    case "info":
      await ctx.reply(
        `Информация о QR-коде:\n\nНазвание: ${qrCode.name}\nURL: ${qrCode.url}`,
      );
      break;

    case "delete":
      try {
        await deleteQRCode(qrCode.uri);
        await ctx.editMessageText(`QR-код "${qrCode.name}" успешно удалён.`);
      } catch (error) {
        console.error("Ошибка при удалении QR-кода:", error);
        await ctx.answerCallbackQuery({ text: "Ошибка при удалении QR-кода." });
      }
      break;

    case "show":
      try {
        // Генерация QR-кода
        const pngBuffer = await generateQRCodeImage(qrCode.url, {
          format: "png",
        });

        // Отправка QR-кода
        await ctx.replyWithPhoto(
          new InputFile(new Uint8Array(pngBuffer.buffer), "qr.png"),
        );
      } catch (error) {
        console.error("Ошибка при генерации QR-кода:", error);
        await ctx.answerCallbackQuery({
          text: "Ошибка при отображении QR-кода.",
        });
      }
      break;

    default:
      console.warn(`Игнорируем callback_data в qrCodeActions: ${data}`);
      await ctx.answerCallbackQuery({ text: "Неизвестное действие." });
  }
}
