const express = require('express');
const router = express.Router();
const dleService = require('../services/dleService');
const logger = require('../utils/logger');
const auth = require('../middleware/auth');
const path = require('path');
const fs = require('fs');

/**
 * @route   POST /api/dle
 * @desc    Создать новое DLE (Digital Legal Entity)
 * @access  Private (только для авторизованных пользователей с ролью admin)
 */
router.post('/', auth.requireAuth, auth.requireAdmin, async (req, res, next) => {
  try {
    const dleParams = req.body;
    logger.info('Получен запрос на создание DLE:', dleParams);
    
    // Если параметр partners не был передан явно, используем адрес авторизованного пользователя
    if (!dleParams.partners || dleParams.partners.length === 0) {
      // Проверяем, есть ли в сессии адрес кошелька пользователя
      if (!req.user || !req.user.walletAddress) {
        return res.status(400).json({ 
          success: false, 
          message: 'Не указан адрес кошелька пользователя или партнеров для распределения токенов' 
        });
      }
      
      // Используем адрес авторизованного пользователя
      dleParams.partners = [req.user.address || req.user.walletAddress];
      
      // Если суммы не указаны, используем значение по умолчанию (100% токенов)
      if (!dleParams.amounts || dleParams.amounts.length === 0) {
        dleParams.amounts = ['1000000'];
      }
    }
    
    const result = await dleService.createDLE(dleParams);
    
    res.status(201).json({
      success: true,
      message: 'DLE успешно создано',
      data: result
    });
  } catch (error) {
    logger.error('Ошибка при создании DLE:', error);
    next(error);
  }
});

/**
 * @route   GET /api/dle
 * @desc    Получить список всех DLE
 * @access  Private (только для авторизованных пользователей)
 */
router.get('/', auth.requireAuth, async (req, res, next) => {
  try {
    const dles = await dleService.getAllDLEs();
    res.json({
      success: true,
      data: dles
    });
  } catch (error) {
    logger.error('Ошибка при получении списка DLE:', error);
    next(error);
  }
});

/**
 * @route   GET /api/dle/settings
 * @desc    Получить настройки для деплоя DLE по умолчанию
 * @access  Private (только для авторизованных пользователей)
 */
router.get('/settings', auth.requireAuth, (req, res) => {
  // Возвращаем настройки по умолчанию, которые будут использоваться 
  // при заполнении формы на фронтенде
  res.json({
    success: true,
    data: {
      votingDelay: 1, // 1 блок задержки перед началом голосования
      votingPeriod: 45818, // ~1 неделя в блоках (при 13 секундах на блок)
      proposalThreshold: '100000', // 100,000 токенов
      quorumPercentage: 4, // 4% от общего количества токенов
      minTimelockDelay: 2 // 2 дня
    }
  });
});

/**
 * @route   DELETE /api/dle/:tokenAddress
 * @desc    Удалить DLE по адресу токена
 * @access  Private (только для авторизованных пользователей с ролью admin)
 */
router.delete('/:tokenAddress', auth.requireAuth, auth.requireAdmin, async (req, res, next) => {
  try {
    const { tokenAddress } = req.params;
    logger.info(`Получен запрос на удаление DLE с адресом токена: ${tokenAddress}`);
    
    // Проверяем существование DLE в директории contracts-data/dles
    const dlesDir = path.join(__dirname, '../contracts-data/dles');
    const files = fs.readdirSync(dlesDir);
    
    let fileToDelete = null;
    
    // Находим файл, содержащий указанный адрес токена
    for (const file of files) {
      const filePath = path.join(dlesDir, file);
      if (fs.statSync(filePath).isFile() && file.endsWith('.json')) {
        try {
          const dleData = JSON.parse(fs.readFileSync(filePath, 'utf8'));
          if (dleData.tokenAddress && dleData.tokenAddress.toLowerCase() === tokenAddress.toLowerCase()) {
            fileToDelete = filePath;
            break;
          }
        } catch (err) {
          logger.error(`Ошибка при чтении файла ${file}:`, err);
        }
      }
    }
    
    if (!fileToDelete) {
      return res.status(404).json({
        success: false,
        message: `DLE с адресом токена ${tokenAddress} не найдено`
      });
    }
    
    // Удаляем файл
    fs.unlinkSync(fileToDelete);
    
    res.json({
      success: true,
      message: `DLE с адресом токена ${tokenAddress} успешно удалено`
    });
  } catch (error) {
    logger.error('Ошибка при удалении DLE:', error);
    next(error);
  }
});

/**
 * @route   DELETE /api/dle/empty/:fileName
 * @desc    Удалить пустое DLE по имени файла
 * @access  Private (только для авторизованных пользователей с ролью admin)
 */
router.delete('/empty/:fileName', auth.requireAuth, auth.requireAdmin, async (req, res, next) => {
  try {
    const { fileName } = req.params;
    logger.info(`Получен запрос на удаление пустого DLE с именем файла: ${fileName}`);
    
    // Проверяем существование файла в директории contracts-data/dles
    const dlesDir = path.join(__dirname, '../contracts-data/dles');
    const filePath = path.join(dlesDir, fileName);
    
    if (!fs.existsSync(filePath)) {
      return res.status(404).json({
        success: false,
        message: `Файл ${fileName} не найден`
      });
    }
    
    // Удаляем файл
    fs.unlinkSync(filePath);
    
    res.json({
      success: true,
      message: `Пустое DLE с именем файла ${fileName} успешно удалено`
    });
  } catch (error) {
    logger.error('Ошибка при удалении пустого DLE:', error);
    next(error);
  }
});

module.exports = router; 