import nodemailer from 'nodemailer';
import { queryOne } from './db';

interface SmtpSettings {
  host: string;
  port: number;
  user: string;
  pass: string;
  secure: boolean;
}

async function getSmtpSettings(): Promise<SmtpSettings> {
  // In dev always use MailHog
  if (process.env.NODE_ENV === 'development') {
    return {
      host: process.env.MAILHOG_HOST || 'ec-mailhog',
      port: parseInt(process.env.MAILHOG_PORT || '1025', 10),
      user: '',
      pass: '',
      secure: false,
    };
  }

  const rows = await query<{ key: string; value: unknown }>(`
    SELECT key, value FROM app_settings
    WHERE key IN ('smtp_host','smtp_port','smtp_user','smtp_pass','smtp_secure')
  `);

  const map: Record<string, unknown> = {};
  for (const row of rows) map[row.key] = row.value;

  return {
    host: (map.smtp_host as string) || 'ec-mailhog',
    port: (map.smtp_port as number) || 1025,
    user: (map.smtp_user as string) || '',
    pass: (map.smtp_pass as string) || '',
    secure: (map.smtp_secure as boolean) || false,
  };
}

async function query<T = unknown>(text: string, params?: unknown[]): Promise<T[]> {
  const { pool } = await import('./db');
  const result = await pool.query(text, params);
  return result.rows as T[];
}

export async function createTransporter() {
  const settings = await getSmtpSettings();
  return nodemailer.createTransport({
    host: settings.host,
    port: settings.port,
    secure: settings.secure,
    auth: settings.user ? { user: settings.user, pass: settings.pass } : undefined,
  });
}

/**
 * Prefer Microsoft 365 / custom SMTP env when set (e.g. sammy@ourdrives.co.za); otherwise MailHog or app_settings.
 */
export async function createOutboundTransporter() {
  const host = process.env.MS365_SMTP_HOST;
  if (host) {
    return nodemailer.createTransport({
      host,
      port: parseInt(process.env.MS365_SMTP_PORT || '587', 10),
      secure: process.env.MS365_SMTP_SECURE === 'true',
      auth:
        process.env.MS365_SMTP_USER && process.env.MS365_SMTP_PASS
          ? { user: process.env.MS365_SMTP_USER, pass: process.env.MS365_SMTP_PASS }
          : undefined,
    });
  }
  return createTransporter();
}

export async function getDefaultFrom(): Promise<{ name: string; email: string }> {
  const name = await queryOne<{ value: string }>('SELECT value FROM app_settings WHERE key = $1', ['default_from_name']);
  const email = await queryOne<{ value: string }>('SELECT value FROM app_settings WHERE key = $1', ['default_from_email']);
  return {
    name: (name?.value as string) || 'Email Campaigner',
    email: (email?.value as string) || 'noreply@example.com',
  };
}
