require('dotenv').config();
const express = require('express');
const cors = require('cors');
const { ethers } = require('ethers');
const emailBot = require('./services/emailBot');
const session = require('express-session');
const { app, nonceStore } = require('./app');
const usersRouter = require('./routes/users');
const authRouter = require('./routes/auth');
const identitiesRouter = require('./routes/identities');
const chatRouter = require('./routes/chat');
const { pool } = require('./db');
const helmet = require('helmet');
const { getBot, stopBot } = require('./services/telegramBot');
const pgSession = require('connect-pg-simple')(session);
const authService = require('./services/auth-service');
const logger = require('./utils/logger');

const PORT = process.env.PORT || 8000;

console.log('Начало выполнения server.js');
console.log('Переменная окружения PORT:', process.env.PORT);
console.log('Используемый порт:', process.env.PORT || 8000);

// Инициализация сервисов
async function initServices() {
  try {
    console.log('Инициализация сервисов...');

    // Останавливаем предыдущий экземпляр бота
    await stopBot();

    // Добавляем обработку ошибок при запуске бота
    try {
      await getBot(); // getBot теперь асинхронный и сам запускает бота
      console.log('Telegram bot started');

      // Добавляем graceful shutdown
      process.once('SIGINT', async () => {
        await stopBot();
        process.exit(0);
      });
      process.once('SIGTERM', async () => {
        await stopBot();
        process.exit(0);
      });
    } catch (error) {
      if (error.code === 409) {
        logger.warn(
          'Another instance of Telegram bot is running. This is normal during development with nodemon'
        );
        // Просто логируем ошибку и продолжаем работу
        // Бот будет запущен при следующем перезапуске
      } else {
        logger.error('Error launching Telegram bot:', error);
      }
    }

    console.log('Все сервисы успешно инициализированы');
  } catch (error) {
    console.error('Ошибка при инициализации сервисов:', error);
  }
}

// Настройка сессий
app.use(
  session({
    store: new pgSession({
      pool: pool,
      tableName: 'session',
    }),
    secret: process.env.SESSION_SECRET || 'hb3atoken',
    resave: false,
    saveUninitialized: true,
    cookie: {
      secure: process.env.NODE_ENV === 'production',
      httpOnly: true,
      maxAge: 30 * 24 * 60 * 60 * 1000, // 30 дней
    },
  })
);

// Маршруты API
app.use('/api/users', usersRouter);
app.use('/api/auth', authRouter);
app.use('/api/identities', identitiesRouter);
app.use('/api/chat', chatRouter);

// Эндпоинт для проверки состояния сервера
app.get('/api/health', (req, res) => {
  res.json({ status: 'ok', timestamp: new Date().toISOString() });
});

// Запуск сервера
const host = app.get('host');
app.listen(PORT, host, async () => {
  try {
    await initServices();
    console.log(`Server is running on http://${host}:${PORT}`);
  } catch (error) {
    console.error('Error starting server:', error);
    process.exit(1);
  }
});

// Обработка ошибок
process.on('unhandledRejection', (err) => {
  logger.error('Unhandled Rejection:', err);
});

process.on('uncaughtException', (err) => {
  logger.error('Uncaught Exception:', err);
});

module.exports = app;
