'use strict';

/**
 * ui/routes/auth.js — /login, /logout для UI-слоя.
 *
 * Два режима:
 *   Mock (DEV_MODE=true) — страница с пресетами MOCK_USERS.
 *                          Выбранный пользователь → генерируем mock Bearer token → session.token.
 *
 *   Token (всегда доступен) — форма вставки реального Bearer токена от auth-api/KC.
 *                             Вставленный токен → session.token (без проверки подписи здесь,
 *                             API сам проверит при первом запросе).
 *
 * /logout — уничтожает сессию.
 */

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

function createRouter({ auth, MOCK_USERS, authLimiter }) {
  const router = Router();
  const devMode = () => process.env.DEV_MODE === 'true';

  // GET /login
  router.get('/login', (req, res) => {
    if (req.session && req.session.token) return res.redirect('/');
    res.render('ui-login', {
      devMode:    devMode(),
      MOCK_USERS: devMode() ? MOCK_USERS : [],
      error:      req.query.error || null,
      returnTo:   req.query.returnTo || '/',
      appVersion: require('../../package.json').version,
    });
  });

  // POST /login — mock user
  router.post('/login', authLimiter, (req, res) => {
    const { clientId, returnTo } = req.body;
    if (!clientId) return res.redirect('/login?error=Выберите+пользователя');

    const user = MOCK_USERS.find(u => u.clientId === clientId);
    if (!user) return res.redirect('/login?error=Пользователь+не+найден');

    // Разбор clientId с запятой (мульти-компания)
    const allClientIds = user.clientId.split(',').map(s => s.trim()).filter(Boolean);
    const activeClientId = allClientIds[0] || user.clientId;

    const token = auth.issueMockToken({
      clientId:    user.clientId,
      companyId:   user.companyId || '00000000-0000-0000-0000-000000000001',
      companyName: user.companyName || user.clientId,
      email:       user.email || user.clientId + '@mock.local',
    });

    req.session.token = token;
    req.session.user  = {
      clientId:       user.clientId,
      allClientIds,
      activeClientId,
      email:          user.email || user.clientId + '@mock.local',
      companyId:      user.companyId || '00000000-0000-0000-0000-000000000001',
      companyName:    user.companyName || user.clientId,
      isAdmin:        user.isAdmin || user.role === 'admin',
    };
    res.redirect(returnTo || '/');
  });

  // GET /login-token — редирект на /login (форма вставки токена там же)
  router.get('/login-token', (req, res) => res.redirect('/login'));

  // POST /login-token — ручной вход по clientId (отладка)
  router.post('/login-token', authLimiter, (req, res) => {
    const { clientId, returnTo } = req.body;
    if (!clientId || !clientId.trim()) return res.redirect('/login?error=Введите+clientId');

    const trimmed = clientId.trim();
    const allClientIds = trimmed.split(',').map(s => s.trim()).filter(Boolean);
    const activeClientId = allClientIds[0];

    const token = auth.issueMockToken({
      clientId:    trimmed,
      companyId:   '00000000-0000-0000-0000-000000000001',
      companyName: activeClientId,
      email:       activeClientId + '@debug.local',
    });

    req.session.token = token;
    req.session.user  = {
      clientId:       trimmed,
      allClientIds,
      activeClientId,
      email:          activeClientId + '@debug.local',
      companyId:      '00000000-0000-0000-0000-000000000001',
      companyName:    activeClientId,
      isAdmin:        activeClientId === (process.env.ADMIN_CLIENT_ID || 'WZ01112'),
    };
    res.redirect(returnTo || '/');
  });

  // GET /logout
  router.get('/logout', (req, res) => {
    req.session.destroy(() => res.redirect('/login'));
  });

  return router;
}

module.exports = { createRouter };
