import dotenv from 'dotenv' // Cargar variables de entorno dotenv.config() // Configuración de variables de entorno export const config = { // NextAuth nextAuth: { url: process.env.NEXTAUTH_URL || 'http://localhost:3000', secret: process.env.NEXTAUTH_SECRET || 'tu-clave-secreta-por-defecto-cambiar-en-produccion', }, // Database database: { url: process.env.DATABASE_URL || 'file:./dev.db', }, // OpenRouter openRouter: { apiKey: process.env.OPENROUTER_API_KEY || '', url: process.env.OPENROUTER_URL || 'https://openrouter.ai/api/v1', model: process.env.OPENROUTER_MODEL || 'deepseek/deepseek-chat-v3-0324:free', }, // Session Configuration session: { maxAge: parseInt(process.env.SESSION_MAX_AGE || '4') * 60 * 60, // Convert hours to seconds jwtMaxAge: parseInt(process.env.JWT_MAX_AGE || '4') * 60 * 60, // Convert hours to seconds }, // UTB API utbApi: { url: process.env.UTB_API_URL || 'https://sai.utb.edu.ec/v2/ws/auth/login', appId: process.env.UTB_API_APP_ID || '', appToken: process.env.UTB_API_APP_TOKEN || '', }, // Jitsi Meet jitsi: { domain: process.env.JITSI_DOMAIN || '', appId: process.env.JITSI_APP_ID || '', appSecret: process.env.JITSI_APP_SECRET || '', useJWT: process.env.JITSI_USE_JWT === 'true', }, // Environment env: process.env.NODE_ENV || 'development', port: process.env.PORT || '3000', } as const // Logger para verificar variables de entorno export function logEnvironmentConfig() { console.log('🔧 Configuración de Variables de Entorno:') console.log('==========================================') // NextAuth console.log('📋 NextAuth:') console.log(` URL: ${config.nextAuth.url}`) console.log(` Secret: ${config.nextAuth.secret ? '✅ Configurado' : '❌ No configurado'}`) // Database console.log('🗄️ Database:') console.log(` URL: ${config.database.url}`) // OpenRouter console.log('🤖 OpenRouter:') console.log(` API Key: ${config.openRouter.apiKey ? '✅ Configurada' : '❌ No configurada'}`) console.log(` URL: ${config.openRouter.url}`) console.log(` Model: ${config.openRouter.model}`) // Session console.log('🔐 Session:') console.log(` Max Age: ${config.session.maxAge / 3600} horas (${config.session.maxAge} segundos)`) console.log(` JWT Max Age: ${config.session.jwtMaxAge / 3600} horas (${config.session.jwtMaxAge} segundos)`) // UTB API console.log('🎓 UTB API:') console.log(` URL: ${config.utbApi.url}`) console.log(` App ID: ${config.utbApi.appId ? '✅ Configurado' : '❌ No configurado'}`) console.log(` App Token: ${config.utbApi.appToken ? '✅ Configurado' : '❌ No configurado'}`) // Jitsi Meet console.log('🎥 Jitsi Meet:') console.log(` Domain: ${config.jitsi.domain}`) console.log(` App ID: ${config.jitsi.appId ? '✅ Configurado' : '❌ No configurado'}`) console.log(` App Secret: ${config.jitsi.appSecret ? '✅ Configurado' : '❌ No configurado'}`) console.log(` Use JWT: ${config.jitsi.useJWT ? '✅ Habilitado' : '❌ Deshabilitado'}`) // Environment console.log('🌍 Environment:') console.log(` NODE_ENV: ${config.env}`) console.log(` PORT: ${config.port}`) console.log('==========================================') // Advertencias if (!config.nextAuth.secret || config.nextAuth.secret === 'tu-clave-secreta-por-defecto-cambiar-en-produccion') { console.log('⚠️ ADVERTENCIA: NEXTAUTH_SECRET no está configurado correctamente') } if (!config.openRouter.apiKey) { console.log('⚠️ ADVERTENCIA: OPENROUTER_API_KEY no está configurada - El chat funcionará con respuestas de fallback') } if (!config.utbApi.appId || !config.utbApi.appToken) { console.log('⚠️ ADVERTENCIA: UTB API credentials no están configuradas') } if (config.jitsi.useJWT && (!config.jitsi.appId || !config.jitsi.appSecret)) { console.log('⚠️ ADVERTENCIA: Jitsi JWT está habilitado pero las credenciales no están configuradas') } console.log('') } // Función para validar configuración crítica export function validateConfig() { const errors: string[] = [] if (!config.nextAuth.secret || config.nextAuth.secret === 'tu-clave-secreta-por-defecto-cambiar-en-produccion') { errors.push('NEXTAUTH_SECRET no está configurado correctamente') } if (!config.database.url) { errors.push('DATABASE_URL no está configurado') } return { isValid: errors.length === 0, errors } }