import { tap, expect } from '@push.rocks/tapbundle';
import * as plugins from '../ts/plugins.js';
import * as paths from '../ts/paths.js';
import { SenderReputationMonitor } from '../ts/deliverability/classes.senderreputationmonitor.js';
import { IPWarmupManager } from '../ts/deliverability/classes.ipwarmupmanager.js';

/**
 * Basic test to check if our integrated classes work correctly
 */
tap.test('verify that SenderReputationMonitor and IPWarmupManager are functioning', async () => {
  // Create instances of both classes
  const reputationMonitor = SenderReputationMonitor.getInstance({
    enabled: true,
    domains: ['example.com']
  });
  
  const ipWarmupManager = IPWarmupManager.getInstance({
    enabled: true,
    ipAddresses: ['192.168.1.1', '192.168.1.2'],
    targetDomains: ['example.com']
  });
  
  // Test SenderReputationMonitor
  reputationMonitor.recordSendEvent('example.com', { type: 'sent', count: 100 });
  reputationMonitor.recordSendEvent('example.com', { type: 'delivered', count: 95 });
  
  const reputationData = reputationMonitor.getReputationData('example.com');
  expect(reputationData).toBeTruthy();
  
  const summary = reputationMonitor.getReputationSummary();
  expect(summary.length).toBeGreaterThan(0);
  
  // Add and remove domains
  reputationMonitor.addDomain('test.com');
  reputationMonitor.removeDomain('test.com');
  
  // Test IPWarmupManager
  ipWarmupManager.setActiveAllocationPolicy('balanced');
  
  const bestIP = ipWarmupManager.getBestIPForSending({
    from: 'test@example.com',
    to: ['recipient@test.com'],
    domain: 'example.com'
  });
  
  if (bestIP) {
    ipWarmupManager.recordSend(bestIP);
    const canSendMore = ipWarmupManager.canSendMoreToday(bestIP);
    expect(typeof canSendMore).toEqual('boolean');
  }
  
  const stageCount = ipWarmupManager.getStageCount();
  expect(stageCount).toBeGreaterThan(0);
});

// Final clean-up test
tap.test('clean up after tests', async () => {
  // No-op - just to make sure everything is cleaned up properly
});

tap.test('stop', async () => {
  await tap.stopForcefully();
});

export default tap.start();