import { existsSync, readFileSync } from 'fs';

const envPath = process.argv[2] ?? '.env.production';

function parseEnvFile(path: string): Record<string, string> {
  if (!existsSync(path)) {
    return {};
  }

  return readFileSync(path, 'utf8')
    .split(/\r?\n/)
    .map((line) => line.trim())
    .filter((line) => line && !line.startsWith('#'))
    .reduce<Record<string, string>>((acc, line) => {
      const index = line.indexOf('=');
      if (index === -1) return acc;
      const key = line.slice(0, index).trim();
      const value = line.slice(index + 1).trim().replace(/^["']|["']$/g, '');
      acc[key] = value;
      return acc;
    }, {});
}

const fileEnv = parseEnvFile(envPath);
const env = { ...process.env, ...fileEnv };
const failures: string[] = [];

function requireValue(key: string) {
  const value = env[key];
  if (!value || value.includes('REPLACE_WITH') || value.includes('change-me')) {
    failures.push(`${key} doit etre renseigne avec une vraie valeur production`);
  }
  return value;
}

function requireHttps(key: string) {
  const value = requireValue(key);
  if (value && !value.startsWith('https://')) {
    failures.push(`${key} doit utiliser HTTPS en production`);
  }
}

requireValue('DATABASE_URL');
requireValue('JWT_ACCESS_SECRET');
requireValue('JWT_REFRESH_SECRET');
requireHttps('APP_BASE_URL');
requireHttps('PUBLIC_WEB_URL');
requireValue('CORS_ORIGINS');
requireValue('SMTP_HOST');
requireValue('SMTP_PORT');
requireValue('SMTP_USER');
requireValue('SMTP_PASSWORD');
requireValue('SMTP_FROM_EMAIL');
requireValue('SMTP_REPLY_TO');
requireValue('DEMO_REQUEST_RECIPIENT_EMAIL');

for (const key of ['JWT_ACCESS_SECRET', 'JWT_REFRESH_SECRET']) {
  const value = env[key];
  if (value && value.length < 32) {
    failures.push(`${key} doit contenir au moins 32 caracteres aleatoires`);
  }
}

if (env.CORS_ORIGINS?.includes('*')) {
  failures.push('CORS_ORIGINS ne doit pas contenir * en production');
}

if (env.ENABLE_STUB_PROVIDERS !== 'false') {
  failures.push('ENABLE_STUB_PROVIDERS doit etre false en production');
}

if (env.ONLINE_PAYMENTS_ENABLED !== 'false') {
  failures.push('ONLINE_PAYMENTS_ENABLED doit rester false pour le lancement virement bancaire');
}

if (env.OFFLINE_PAYMENT_METHODS !== 'BANK_TRANSFER') {
  failures.push('OFFLINE_PAYMENT_METHODS doit etre BANK_TRANSFER au lancement');
}

if (env.NOTIFICATION_CHANNELS_ENABLED !== 'EMAIL,IN_APP') {
  failures.push('NOTIFICATION_CHANNELS_ENABLED doit etre EMAIL,IN_APP au lancement');
}

if (failures.length) {
  console.error('Configuration production invalide:');
  for (const failure of failures) console.error(`- ${failure}`);
  process.exit(1);
}

console.log(`Configuration production valide: ${envPath}`);
