/**
 * src/routes/export.js — маршрут GET /export (требует авторизации).
 *
 * Назначение: отдаёт агрегированный список активных CIDR в виде текстового файла.
 *
 * Изоляция по ролям:
 *   - Обычный пользователь → только CIDR своей компании.
 *   - Администратор        → все компании (или фильтр по ?company=<id>).
 *
 * Особенности:
 *   - Требует авторизации: регистрируется ПОСЛЕ auth.middleware в server.js.
 *   - Ограничен exportLimiter: не более 20 запросов/мин с одного IP.
 *   - aggregateCIDRs объединяет перекрывающиеся диапазоны → минимальный набор.
 *
 * Паттерн «фабрика»:
 *   Вместо прямых require(зависимостей) получаем их через параметр deps.
 *   Это позволяет легко подменять зависимости в тестах (mock q, mock aggregateCIDRs).
 *
 * @param {{ q: object, exportLimiter: Function, aggregateCIDRs: Function }} deps
 * @returns {import('express').Router}
 */

'use strict';

const { Router } = require('express');

function createRouter({ q, exportLimiter, aggregateCIDRs }) {
  const router = Router();

  // GET /export — агрегированный whitelist CIDR в текстовом виде.
  // Требует авторизации (регистрируется ПОСЛЕ auth.middleware в server.js).
  // Изоляция по ролям:
  //   - Обычный пользователь → только CIDR своей компании.
  //   - Администратор        → все компании, или фильтр по ?company=<id>.
  // exportLimiter ограничивает частоту запросов (20/мин).
  router.get('/export', exportLimiter, async (req, res) => {
    try {
      let companyId = null;

      if (!req.user.isAdmin) {
        // Обычный пользователь: только его компания.
        // getOrCreateCompany — атомарная UPSERT, безопасна для параллельных вызовов.
        const company = await q.getOrCreateCompany(req.user.clientId, req.user.companyName);
        companyId = company.id;
      } else if (req.query.company) {
        // Администратор с необязательным фильтром по компании.
        const parsed = parseInt(req.query.company, 10);
        if (Number.isFinite(parsed) && parsed > 0) companyId = parsed;
      }
      // Администратор без ?company → companyId остаётся null → все компании.

      const cidrs = await q.getExportCIDRs(companyId);

      // Суммаризация: объединяем пересекающиеся и смежные диапазоны.
      // Например: 192.168.0.0/25 + 192.168.0.128/25 → 192.168.0.0/24
      const aggregated = aggregateCIDRs(cidrs);

      // Content-Type: text/plain — чтобы браузер не пытался разбирать как HTML.
      // Content-Disposition: inline — открывается в браузере, а не скачивается.
      res.setHeader('Content-Type', 'text/plain; charset=utf-8');
      res.setHeader('Content-Disposition', 'inline; filename="whitelist.txt"');

      // Один CIDR на строку. Если список пустой — возвращаем пустую строку (не ошибку).
      res.send(aggregated.join('\n') + (aggregated.length ? '\n' : ''));
    } catch (e) {
      console.error('Export error:', e);
      res.status(500).send('Export error');
    }
  });

  return router;
}

module.exports = { createRouter };
