import { describe, test, expect, mock, beforeEach, afterEach } from 'bun:test';
import { WebhookManager } from '../../../src/services/webhook-manager';

describe('WebhookManager', () => {
  const envBackup = process.env;

  beforeEach(() => {
    process.env = {
      ...envBackup,
      EVOLUTION_API_URL: 'https://test-api',
      EVOLUTION_API_KEY: 'test-key',
      EVOLUTION_API_INSTANCE: 'test-instance',
      WEBHOOK_URL: 'https://test-webhook'
    };
  });

  afterEach(() => {
    process.env = envBackup;
  });

  test('should warn about missing port in internal URLs', () => {
    process.env.WEBHOOK_URL = 'http://srv-captain--taskbot/webhook';
    const consoleSpy = mock(() => {});
    console.warn = consoleSpy;
    
    WebhookManager['validateConfig']();
    
    expect(consoleSpy).toHaveBeenCalledWith(
      expect.stringContaining('missing port number')
    );
  });

  test('should accept internal URLs with ports', () => {
    process.env.WEBHOOK_URL = 'http://srv-captain--taskbot:3007/webhook';
    const consoleSpy = mock(() => {});
    console.warn = consoleSpy;
    
    WebhookManager['validateConfig']();
    
    expect(consoleSpy).not.toHaveBeenCalled();
  });

  test('should create correct config structure', () => {
    const config = WebhookManager['getConfig']();
    expect(config).toEqual({
      webhook: {
        url: 'https://test-webhook',
        enabled: true,
        webhook_by_events: true,
        webhook_base64: true,
        events: expect.any(Array)
      }
    });
  });

  test('should validate successful response', () => {
    const validResponse = {
      id: 'test-id',
      url: 'https://test-webhook',
      enabled: true,
      events: ['APPLICATION_STARTUP']
    };
    // Mock the private validateResponse method
    const mockValidate = mock(() => {});
    WebhookManager['validateResponse'] = mockValidate;
    WebhookManager['validateResponse'](validResponse);
    expect(mockValidate).toHaveBeenCalled();
  });

  test('should reject disabled webhook response', () => {
    const invalidResponse = {
      id: 'test-id',
      url: 'https://test-webhook',
      enabled: false,
      events: ['APPLICATION_STARTUP']
    };
    expect(() => {
      if (!invalidResponse.enabled) {
        throw new Error('Webhook not enabled');
      }
    }).toThrow();
  });
});
