import 'dotenv/config';
import crypto from 'node:crypto';

function required(name, fallback) {
  const value = process.env[name] ?? fallback;
  if (value === undefined) {
    throw new Error(`Не задана обязательная переменная окружения: ${name}`);
  }
  return value;
}

export const config = {
  port: Number(process.env.PORT || 4000),
  jwtSecret: required('JWT_SECRET', 'dev-insecure-secret-change-me'),
  admin: {
    email: required('ADMIN_EMAIL', 'admin@local'),
    password: required('ADMIN_PASSWORD', 'admin12345'),
  },
  anthropicApiKey: process.env.ANTHROPIC_API_KEY || '',
  claudeModel: process.env.CLAUDE_MODEL || 'claude-opus-4-8',
};

// Ключ шифрования для секретов почты (пароли IMAP/SMTP).
// Эти пароли нельзя хэшировать — нам нужно их расшифровать, чтобы подключиться.
// Поэтому шифруем симметрично ключом, производным от JWT_SECRET.
const encryptionKey = crypto.createHash('sha256').update(config.jwtSecret).digest();

export function encrypt(plainText) {
  if (plainText == null || plainText === '') return '';
  const iv = crypto.randomBytes(12);
  const cipher = crypto.createCipheriv('aes-256-gcm', encryptionKey, iv);
  const encrypted = Buffer.concat([cipher.update(String(plainText), 'utf8'), cipher.final()]);
  const tag = cipher.getAuthTag();
  // Формат: iv:tag:ciphertext (base64)
  return [iv.toString('base64'), tag.toString('base64'), encrypted.toString('base64')].join(':');
}

export function decrypt(payload) {
  if (!payload) return '';
  const [ivB64, tagB64, dataB64] = String(payload).split(':');
  if (!ivB64 || !tagB64 || !dataB64) return '';
  const decipher = crypto.createDecipheriv('aes-256-gcm', encryptionKey, Buffer.from(ivB64, 'base64'));
  decipher.setAuthTag(Buffer.from(tagB64, 'base64'));
  const decrypted = Buffer.concat([decipher.update(Buffer.from(dataB64, 'base64')), decipher.final()]);
  return decrypted.toString('utf8');
}
