/**
 * Copyright (c) 2024-2026 Тарабанов Александр Викторович
 * All rights reserved.
 * 
 * This software is proprietary and confidential.
 * Unauthorized copying, modification, or distribution is prohibited.
 * 
 * For licensing inquiries: info@hb3-accelerator.com
 * Website: https://hb3-accelerator.com
 * GitHub: https://github.com/VC-HB3-Accelerator
 */

const session = require('express-session');
const pgSession = require('connect-pg-simple')(session);
const db = require('../db');
const crypto = require('crypto');

let onPoolChangeCallback = null;

function setPoolChangeCallback(cb) {
  onPoolChangeCallback = cb;
}

let sessionMiddleware = createSessionMiddleware();

function createSessionMiddleware() {
  const isProduction = process.env.NODE_ENV === 'production';
  
  return session({
    store: new pgSession({
      pool: db.getPool(),
      tableName: 'session',
      // Обработка ошибок подключения к БД для сессий
      errorLog: (err) => {
        // Логируем только как предупреждение, не как критическую ошибку
        // Таймауты подключения - это нормальная ситуация при перегрузке
        if (err && err.message && err.message.includes('timeout exceeded')) {
          console.warn('[session] Timeout подключения к БД для сессии (не критично):', err.message);
        } else if (err) {
          console.error('[session] Ошибка подключения к БД для сессии:', err.message);
        }
      },
    }),
    secret: process.env.SESSION_SECRET || crypto.randomBytes(32).toString('hex'),
    name: 'sessionId',
    resave: true,
    saveUninitialized: false,
    cookie: {
      maxAge: 30 * 24 * 60 * 60 * 1000,
      httpOnly: true,
      secure: false,  // false для локального Docker (HTTP)
      sameSite: 'lax',  // lax для локального Docker
      path: '/',
    },
  });
}

function reloadSessionMiddleware() {
  sessionMiddleware = createSessionMiddleware();
  if (onPoolChangeCallback) {
    onPoolChangeCallback();
  }
}

module.exports = {
  get sessionMiddleware() {
    return sessionMiddleware;
  },
  reloadSessionMiddleware,
  setPoolChangeCallback,
};
