import { describe, it, expect, beforeAll, afterAll } from 'vitest';
import {
  scheduleEmailCampaign,
  cancelScheduledCampaign,
  getScheduledCampaigns,
  shutdownCampaignScheduler,
} from './_core/campaignScheduler.ts';

describe('Campaign Scheduler', () => {
  afterAll(() => {
    shutdownCampaignScheduler();
  });

  it('should schedule a campaign for future execution', () => {
    const futureTime = new Date(Date.now() + 60000); // 1 minute from now
    scheduleEmailCampaign(1, 'Test Campaign', futureTime);

    const scheduled = getScheduledCampaigns();
    expect(scheduled.length).toBeGreaterThan(0);
    expect(scheduled[0].id).toBe(1);
    expect(scheduled[0].name).toBe('Test Campaign');
  });

  it('should handle multiple scheduled campaigns', () => {
    const time1 = new Date(Date.now() + 120000); // 2 minutes
    const time2 = new Date(Date.now() + 180000); // 3 minutes

    scheduleEmailCampaign(2, 'Campaign 2', time1);
    scheduleEmailCampaign(3, 'Campaign 3', time2);

    const scheduled = getScheduledCampaigns();
    expect(scheduled.length).toBeGreaterThanOrEqual(2);
  });

  it('should cancel a scheduled campaign', () => {
    const futureTime = new Date(Date.now() + 240000); // 4 minutes
    scheduleEmailCampaign(4, 'Campaign to Cancel', futureTime);

    let scheduled = getScheduledCampaigns();
    const initialCount = scheduled.length;

    const cancelled = cancelScheduledCampaign(4);
    expect(cancelled).toBe(true);

    scheduled = getScheduledCampaigns();
    expect(scheduled.length).toBeLessThan(initialCount);
  });

  it('should return false when cancelling non-existent campaign', () => {
    const cancelled = cancelScheduledCampaign(99999);
    expect(cancelled).toBe(false);
  });

  it('should track scheduled campaigns correctly', () => {
    const time = new Date(Date.now() + 300000); // 5 minutes
    scheduleEmailCampaign(5, 'Tracked Campaign', time);

    const scheduled = getScheduledCampaigns();
    const found = scheduled.find((c) => c.id === 5);

    expect(found).toBeDefined();
    expect(found?.name).toBe('Tracked Campaign');
    expect(found?.scheduledTime).toEqual(time);
  });

  it('should shutdown scheduler and clear all campaigns', () => {
    const time = new Date(Date.now() + 360000); // 6 minutes
    scheduleEmailCampaign(6, 'Campaign Before Shutdown', time);

    let scheduled = getScheduledCampaigns();
    expect(scheduled.length).toBeGreaterThan(0);

    shutdownCampaignScheduler();

    scheduled = getScheduledCampaigns();
    expect(scheduled.length).toBe(0);
  });
});
