import {
  getWarehouseNameById,
  getWarehouseKeyboard,
  formatCoefficientsMessage,
  startMonitoring,
  stopMonitoring,
  setWarehousesCache,
  boxTypeNames,
  warehousesCache, // Импортируем кеш из utils.js
} from './utils.js';
import { fetchWarehouses, fetchAcceptanceCoefficients } from './api.js';

export let trackingIntervals = {}; // Глобальный объект для хранения интервалов

const helpMessage =
  '📜 Доступные команды:\n' +
  '/start - Начать мониторинг\n' +
  '/stop - Остановить мониторинг\n' +
  '/changeapi - Сменить API ключ\n' +
  '/help - Показать справку\n\n' +
  '🤖 Как работать с ботом:\n' +
  '1. Нажмите /start для начала мониторинга.\n' +
  '2. Выберите представленный склад.\n' +
  '3. Выберите тип поставки.\n' +
  '4. Бот будет отслеживать доступные поставки и уведомлять вас о них.';

async function fetchAndFilterCoefficients(ctx, warehouseID, boxTypeID) {
  const coefficients = await fetchAcceptanceCoefficients(ctx.session.apiKey, warehouseID);

  if (!coefficients || coefficients.length === 0) {
    console.log(`Нет доступных коэффициентов для склада ${warehouseID}`);
    await ctx.editMessageText('❌ На этом складе нет доступных коэффициентов для приёмки.');
    return null;
  }

  const filteredCoefficients = coefficients.filter(
    (coeff) => coeff.coefficient !== -1 && coeff.boxTypeID === boxTypeID,
  );

  if (filteredCoefficients.length === 0) {
    console.log(`Нет доступных поставок для склада ${warehouseID} и типа поставки ${boxTypeID}`);
    await ctx.editMessageText('❌ Нет доступных поставок по выбранному типу.');
    await ctx.reply('🔍 Будем отслеживать?', {
      reply_markup: {
        inline_keyboard: [
          [
            {
              text: 'Да',
              callback_data: JSON.stringify({ warehouseID, boxTypeID, monitor: true }),
            },
            {
              text: 'Нет',
              callback_data: JSON.stringify({ warehouseID, boxTypeID, monitor: false }),
            },
          ],
        ],
      },
    });
    return null;
  }

  console.log(
    `Отфильтрованные коэффициенты для склада ${warehouseID} и типа поставки ${boxTypeID}:`,
    filteredCoefficients,
  );
  return filteredCoefficients;
}

async function displayCoefficients(ctx, filteredCoefficients, warehouseID, boxTypeID) {
  const currentTime = new Date().toLocaleTimeString();
  const replyMessage = formatCoefficientsMessage(filteredCoefficients, warehouseID, boxTypeID);
  await ctx.editMessageText(`${replyMessage}\n\n🕒 Обновлено в ${currentTime}`, {
    reply_markup: {
      inline_keyboard: [
        [
          {
            text: '🏠 Другой склад',
            callback_data: JSON.stringify({ warehouseID, boxTypeID, changeWarehouse: true }),
          },
          {
            text: '🔁 Повторить поиск',
            callback_data: JSON.stringify({ warehouseID, boxTypeID, repeatSearch: true }),
          },
          {
            text: '🚫 Закончить поиск',
            callback_data: JSON.stringify({ warehouseID, boxTypeID, continueSearch: false }),
          },
        ],
      ],
    },
  });
}

export async function handleStart(ctx) {
  if (!ctx.session.apiKey) {
    ctx.reply('🔑 Пожалуйста, отправьте ваш API ключ.');
    return;
  }

  const warehouses = await fetchWarehouses(ctx.session.apiKey);

  if (!warehouses || warehouses.length === 0) {
    ctx.reply('❌ Нет доступных складов.');
    return;
  }

  setWarehousesCache(warehouses); // Устанавливаем данные о складах в utils.js
  ctx.session.currentPage = 0; // Начинаем с первой страницы
  const message = await ctx.reply('🏢 Выберите склад:', {
    reply_markup: {
      inline_keyboard: getWarehouseKeyboard(warehouses, 0),
    },
  });

  ctx.session.messageId = message.message_id; // Сохраняем ID сообщения
}

export async function handleCallbackQuery(ctx) {
  const { warehouseID, boxTypeID, monitor, continueSearch, changeWarehouse, repeatSearch, page } =
    JSON.parse(ctx.callbackQuery.data);

  if (page !== undefined) {
    // Если нажата кнопка навигации
    ctx.session.currentPage = page;
    await ctx.editMessageText('🏢 Выберите склад:', {
      reply_markup: {
        inline_keyboard: getWarehouseKeyboard(warehousesCache, page), // Используем кеш складов
      },
    });
    return;
  }

  if (warehouseID && !boxTypeID) {
    // Если выбран склад, предложить выбрать тип поставки
    ctx.answerCbQuery();
    await ctx.editMessageText('🚚 Выберите тип поставки:', {
      reply_markup: {
        inline_keyboard: Object.keys(boxTypeNames).map((typeID) => [
          {
            text: boxTypeNames[typeID],
            callback_data: JSON.stringify({ warehouseID, boxTypeID: parseInt(typeID) }),
          },
        ]),
      },
    });
    return;
  }

  if (monitor !== undefined) {
    // Если ответ на вопрос об отслеживании
    if (monitor) {
      await ctx.editMessageText('🔍 Выбран мониторинг. Мы начнем отслеживать.');
      startMonitoring(ctx, warehouseID, boxTypeID);
    } else {
      await ctx.editMessageText('🚫 Мониторинг не будет запущен.');
    }
    return;
  }

  if (continueSearch !== undefined) {
    // Если ответ на вопрос о продолжении поиска
    if (continueSearch) {
      await ctx.editMessageText('🔍 Продолжаем поиск...');
      startMonitoring(ctx, warehouseID, boxTypeID);
    } else {
      await ctx.editMessageText('🚫 Мониторинг остановлен.');
      stopMonitoring(ctx);
    }
    return;
  }

  if (changeWarehouse !== undefined) {
    // Если ответ на вопрос о смене склада
    ctx.session.currentPage = 0;
    await ctx.editMessageText('🏢 Выберите склад:', {
      reply_markup: {
        inline_keyboard: getWarehouseKeyboard(warehousesCache, 0), // Используем кеш складов
      },
    });
    return;
  }

  if (repeatSearch !== undefined || boxTypeID) {
    ctx.answerCbQuery();
    console.log(`Повторный поиск для склада ${warehouseID} и типа поставки ${boxTypeID}...`);

    const filteredCoefficients = await fetchAndFilterCoefficients(ctx, warehouseID, boxTypeID);
    if (filteredCoefficients) {
      await displayCoefficients(ctx, filteredCoefficients, warehouseID, boxTypeID);
    }
  }
}

export async function handleText(ctx) {
  if (ctx.message.text.startsWith('/changeapi')) {
    ctx.session.awaitingApiKey = true;
    ctx.reply('🔑 Пожалуйста, отправьте новый API ключ.');
    return;
  }

  if (ctx.session.awaitingApiKey) {
    ctx.session.apiKey = ctx.message.text;
    ctx.session.awaitingApiKey = false;
    ctx.reply(
      '🔑 API ключ сохранен. Теперь вы можете использовать команду /start для начала мониторинга.',
    );
    return;
  }

  if (ctx.message.text.startsWith('/help')) {
    ctx.reply(helpMessage);
    return;
  }

  if (ctx.message.text.startsWith('/stop')) {
    stopMonitoring(ctx);
    ctx.reply('🚫 Мониторинг остановлен.');
    return;
  }

  // Если API ключ не установлен, запрашиваем его
  if (!ctx.session.apiKey) {
    ctx.session.awaitingApiKey = true;
    ctx.reply('🔑 Пожалуйста, отправьте ваш API ключ.');
    return;
  }

  // Обработка других текстовых сообщений
  ctx.reply(
    '📝 Ваше сообщение получено, но не обработано. Используйте команды /start, /stop, /changeapi или /help.',
  );
}

export async function handleHelp(ctx) {
  ctx.reply(helpMessage);
}

export async function handleStop(ctx) {
  stopMonitoring(ctx);
  ctx.reply('🚫 Мониторинг остановлен.');
}

нужно сделать следующее, когда бот пишет пользователю "❌ Нет доступных поставок по выбранному типу." а затем '🔍 Будем отслеживать?' и если пользователь выбирает "Да" то нужно удалять сообщение '❌ Нет доступных поставок по выбранному типу.' иначе потом в чате получается WB Поставка, [07.12.2024 10:24]
❌ Нет доступных поставок по выбранному типу.

WB Поставка, [07.12.2024 10:27]
🔍 Выбран мониторинг. Мы начнем отслеживать.

WB Поставка, [07.12.2024 10:46]
❌ Нет доступных поставок по выбранному типу.

WB Поставка, [07.12.2024 10:58]
🔍 Выбран мониторинг. Мы начнем отслеживать.

WB Поставка, [07.12.2024 14:40]
❌ Нет доступных поставок по выбранному типу.

WB Поставка, [07.12.2024 14:57]
🔍 Выбран мониторинг. Мы начнем отслеживать.

WB Поставка, [07.12.2024 15:02]
❌ Нет доступных поставок по выбранному типу.

WB Поставка, [07.12.2024 15:03]
🔍 Выбран мониторинг. Мы начнем отслеживать.