import { HookManager } from '../../core/hooks';
import { UltramsgCompatService } from './ultramsg-compat.service';
import { UltramsgMediaService } from './ultramsg-media.service';
import type { SessionService } from '../session/session.service';
import type { WebhookService } from '../webhook/webhook.service';
import type { WebhookPayload } from '../webhook/webhook-delivery.service';

describe('UltramsgCompatService webhook:before', () => {
  const prevCompat = process.env.ULTRAMSG_COMPAT;
  const prevUrl = process.env.ULTRAMSG_WEBHOOK_URL;

  afterEach(() => {
    if (prevCompat === undefined) delete process.env.ULTRAMSG_COMPAT;
    else process.env.ULTRAMSG_COMPAT = prevCompat;
    if (prevUrl === undefined) delete process.env.ULTRAMSG_WEBHOOK_URL;
    else process.env.ULTRAMSG_WEBHOOK_URL = prevUrl;
  });

  it('reshapes message.received into the UltraMsg envelope list PHP reads', async () => {
    process.env.ULTRAMSG_COMPAT = 'true';
    process.env.ULTRAMSG_WEBHOOK_URL = '';

    const hookManager = new HookManager();
    const media = {
      saveInbound: jest.fn().mockReturnValue(''),
    } as unknown as UltramsgMediaService;
    const sessions = {
      findOne: jest.fn().mockResolvedValue({ name: '106047' }),
      findAll: jest.fn().mockResolvedValue([]),
    } as unknown as SessionService;
    const webhooks = {
      findBySession: jest.fn(),
      create: jest.fn(),
    } as unknown as WebhookService;

    const service = new UltramsgCompatService(hookManager, media, sessions, webhooks);
    service.onModuleInit();

    const payload: WebhookPayload = {
      event: 'message.received',
      timestamp: '2026-01-01T00:00:00.000Z',
      sessionId: 'sess-1',
      idempotencyKey: 'k',
      deliveryId: 'd',
      data: {
        id: 'false_120363427659671592@g.us_AC3E7C1E38654D81907DA46598C831C8',
        from: '120363427659671592@g.us',
        to: '919201524818@c.us',
        chatId: '120363427659671592@g.us',
        body: '1-1',
        type: 'text',
        fromMe: false,
        isGroup: true,
        author: '33441370386596@lid',
        senderPhone: '918956456710',
        quotedMessage: {
          id: 'false_120363427659671592@g.us_AAAABBBBCCCCDDDDEEEEFFFF00001111',
          body: 'prev',
        },
      },
    };

    const result = await hookManager.execute(
      'webhook:before',
      { sessionId: 'sess-1', event: 'message.received', payload },
      { sessionId: 'sess-1', source: 'test' },
    );

    expect(result.continue).toBe(true);
    const out = result.data.payload as WebhookPayload & {
      event_type: string;
      instanceId: string;
      data: Record<string, unknown>;
    };
    expect(out.event_type).toBe('message_received');
    expect(out.instanceId).toBe('106047');
    expect(out.data.type).toBe('chat');
    expect(out.data.from).toBe('120363427659671592@g.us');
    expect(out.data.author).toBe('918956456710@c.us');
    expect(out.data.body).toBe('1-1');
    expect(out.data.media).toBe('');
    expect((out.data.quotedMsg as { id: string }).id).toContain('@g.us_');
    expect(typeof out.data.media).toBe('string');

    service.onModuleDestroy();
  });

  it('does not register hooks when ULTRAMSG_COMPAT is off', () => {
    process.env.ULTRAMSG_COMPAT = 'false';
    const hookManager = new HookManager();
    const service = new UltramsgCompatService(
      hookManager,
      { saveInbound: jest.fn() } as unknown as UltramsgMediaService,
      { findAll: jest.fn() } as unknown as SessionService,
      { findBySession: jest.fn() } as unknown as WebhookService,
    );
    service.onModuleInit();
    expect(hookManager.getHookCount('webhook:before')).toBe(0);
    service.onModuleDestroy();
  });
});
