/**
 * SMTP Client Factory
 * Factory function for client creation and dependency injection
 */

import { SmtpClient } from './smtp-client.js';
import { ConnectionManager } from './connection-manager.js';
import { CommandHandler } from './command-handler.js';
import { AuthHandler } from './auth-handler.js';
import { TlsHandler } from './tls-handler.js';
import { SmtpErrorHandler } from './error-handler.js';
import type { ISmtpClientOptions } from './interfaces.js';
import { validateClientOptions } from './utils/validation.js';
import { DEFAULTS } from './constants.js';

/**
 * Create a complete SMTP client with all components
 */
export function createSmtpClient(options: ISmtpClientOptions): SmtpClient {
  // Validate options
  const errors = validateClientOptions(options);
  if (errors.length > 0) {
    throw new Error(`Invalid client options: ${errors.join(', ')}`);
  }
  
  // Apply defaults
  const clientOptions: ISmtpClientOptions = {
    connectionTimeout: DEFAULTS.CONNECTION_TIMEOUT,
    socketTimeout: DEFAULTS.SOCKET_TIMEOUT,
    maxConnections: DEFAULTS.MAX_CONNECTIONS,
    maxMessages: DEFAULTS.MAX_MESSAGES,
    pool: false,
    secure: false,
    debug: false,
    ...options
  };
  
  // Create handlers
  const errorHandler = new SmtpErrorHandler(clientOptions);
  const connectionManager = new ConnectionManager(clientOptions);
  const commandHandler = new CommandHandler(clientOptions);
  const authHandler = new AuthHandler(clientOptions, commandHandler);
  const tlsHandler = new TlsHandler(clientOptions, commandHandler);
  
  // Create and return SMTP client
  return new SmtpClient({
    options: clientOptions,
    connectionManager,
    commandHandler,
    authHandler,
    tlsHandler,
    errorHandler
  });
}

/**
 * Create SMTP client with connection pooling enabled
 */
export function createPooledSmtpClient(options: ISmtpClientOptions): SmtpClient {
  return createSmtpClient({
    ...options,
    pool: true,
    maxConnections: options.maxConnections || DEFAULTS.MAX_CONNECTIONS,
    maxMessages: options.maxMessages || DEFAULTS.MAX_MESSAGES
  });
}

/**
 * Create SMTP client for high-volume sending
 */
export function createBulkSmtpClient(options: ISmtpClientOptions): SmtpClient {
  return createSmtpClient({
    ...options,
    pool: true,
    maxConnections: Math.max(options.maxConnections || 10, 10),
    maxMessages: Math.max(options.maxMessages || 1000, 1000),
    connectionTimeout: options.connectionTimeout || 30000,
    socketTimeout: options.socketTimeout || 120000
  });
}

/**
 * Create SMTP client for transactional emails
 */
export function createTransactionalSmtpClient(options: ISmtpClientOptions): SmtpClient {
  return createSmtpClient({
    ...options,
    pool: false, // Use fresh connections for transactional emails
    maxConnections: 1,
    maxMessages: 1,
    connectionTimeout: options.connectionTimeout || 10000,
    socketTimeout: options.socketTimeout || 30000
  });
}