import express from 'express';
import cors from 'cors';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import generateReviewRouter from './src/api/generate-review.js';
import TelegramBot from 'node-telegram-bot-api';
import PocketBase from 'pocketbase';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const app = express();
const port = process.env.PORT || 3000;

// Инициализация Telegram бота
const bot = new TelegramBot('8057681898:AAE0BCbcg6M0BgREaOeXsjK7yXBHVpOIs9c', { polling: false });

// Инициализация PocketBase
const pb = new PocketBase('https://pocketbase.campfiregg.ru');

// Middleware
app.use(cors());
app.use(express.json());

// API routes
app.use('/api', generateReviewRouter);

// Telegram авторизация
app.post('/api/auth/telegram', async (req, res) => {
  try {
    const { id, first_name, username, photo_url, auth_date, hash } = req.body;
    
    if (!id) {
      return res.status(400).json({
        success: false,
        error: 'Отсутствует ID пользователя Telegram'
      });
    }

    console.log('Получены данные от Telegram:', { id, first_name, username });

    // Очищаем и валидируем данные
    const cleanUsername = (username || `user_${id}`).replace(/[^a-zA-Z0-9_]/g, '_').toLowerCase();
    const cleanFirstName = (first_name || '').replace(/[<>]/g, '');

    // Проверяем, существует ли пользователь с таким Telegram ID
    const users = await pb.collection('users').getList(1, 1, {
      filter: `telegram_id = ${id}`
    });

    let user;
    if (users.items.length > 0) {
      // Если пользователь существует, используем его
      user = users.items[0];
      console.log('Найден существующий пользователь:', user.id);
    } else {
      // Генерируем случайный пароль для пользователя
      const randomPassword = Math.random().toString(36).slice(-8);
      
      // Если пользователь не существует, создаем нового
      try {
        const userData = {
          username: cleanUsername,
          login: cleanUsername,
          telegram_id: id,
          telegram_username: username,
          telegram_first_name: cleanFirstName,
          telegram_photo_url: photo_url,
          email: `${cleanUsername}@telegram.user`,
          password: randomPassword,
          passwordConfirm: randomPassword,
          verified: true
        };

        console.log('Создаем пользователя с данными:', userData);
        
        user = await pb.collection('users').create(userData);
        console.log('Создан новый пользователь:', user.id);
      } catch (createError) {
        console.error('Ошибка при создании пользователя:', createError);
        return res.status(500).json({
          success: false,
          error: 'Ошибка при создании пользователя: ' + (createError.data?.message || createError.message)
        });
      }
    }
    
    // Генерируем JWT токен
    const token = `telegram_${id}_${Date.now()}`;
    
    res.json({
      success: true,
      token,
      user: {
        id: user.id,
        username: user.username,
        login: user.login,
        telegram_id: id,
        telegram_username: username,
        telegram_first_name: first_name,
        telegram_photo_url: photo_url
      }
    });
  } catch (error) {
    console.error('Ошибка авторизации через Telegram:', error);
    res.status(500).json({
      success: false,
      error: 'Ошибка авторизации: ' + (error.data?.message || error.message)
    });
  }
});

// Привязка Telegram к существующему профилю
app.post('/api/auth/telegram/link', async (req, res) => {
  try {
    const { id, first_name, username, photo_url, auth_date, hash, userId } = req.body;
    
    if (!userId) {
      return res.status(400).json({
        success: false,
        error: 'Не указан ID пользователя'
      });
    }

    // Проверяем, не привязан ли уже этот Telegram ID к другому аккаунту
    const existingUsers = await pb.collection('users').getList(1, 1, {
      filter: `telegram_id = ${id}`
    });

    if (existingUsers.items.length > 0) {
      return res.status(400).json({
        success: false,
        error: 'Этот Telegram аккаунт уже привязан к другому профилю'
      });
    }

    // Обновляем профиль пользователя
    const user = await pb.collection('users').update(userId, {
      telegram_id: id,
      telegram_username: username,
      telegram_first_name: first_name,
      telegram_photo_url: photo_url
    });
    
    res.json({
      success: true,
      user: {
        id: user.id,
        username: user.username,
        telegram_id: id,
        telegram_username: username,
        telegram_first_name: first_name,
        telegram_photo_url: photo_url
      }
    });
  } catch (error) {
    console.error('Ошибка привязки Telegram:', error);
    res.status(500).json({
      success: false,
      error: 'Ошибка привязки Telegram'
    });
  }
});

// Serve static files in production
if (process.env.NODE_ENV === 'production') {
  app.use(express.static(join(__dirname, 'dist')));
  
  app.get('*', (req, res) => {
    res.sendFile(join(__dirname, 'dist', 'index.html'));
  });
}

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
}); 