import { ConfigService } from '@nestjs/config';
import { MailerService } from '@nestjs-modules/mailer';
import { MailService } from './mail.service';

describe('MailService', () => {
  let service: MailService;
  let sendMail: jest.Mock;
  let configGet: jest.Mock;

  beforeEach(() => {
    sendMail = jest.fn().mockResolvedValue(undefined);
    configGet = jest.fn().mockReturnValue('https://app.example.com');

    service = new MailService(
      { sendMail } as unknown as MailerService,
      { get: configGet } as unknown as ConfigService,
    );
  });

  it('sends the activation mail with the confirm-email link', async () => {
    await service.userSignUp({
      to: 'user@example.com',
      data: { hash: 'abc123', firstName: 'Max' },
    });

    expect(sendMail).toHaveBeenCalledTimes(1);
    const call = sendMail.mock.calls[0][0];
    expect(call.to).toBe('user@example.com');
    expect(call.template).toBe('activation');
    expect(call.context.url).toBe(
      'https://app.example.com/confirm-email/abc123',
    );
    expect(call.context.firstName).toBe('Max');
  });

  it('sends the reset-password mail with the password-change link', async () => {
    await service.forgotPassword({
      to: 'user@example.com',
      data: { hash: 'xyz789', firstName: 'Erika' },
    });

    expect(sendMail).toHaveBeenCalledTimes(1);
    const call = sendMail.mock.calls[0][0];
    expect(call.to).toBe('user@example.com');
    expect(call.template).toBe('reset-password');
    expect(call.context.url).toBe(
      'https://app.example.com/password-change/xyz789',
    );
    expect(call.context.firstName).toBe('Erika');
  });

  it('works without a firstName (optional personalization)', async () => {
    await service.userSignUp({
      to: 'user@example.com',
      data: { hash: 'abc123' },
    });

    const call = sendMail.mock.calls[0][0];
    expect(call.context.firstName).toBeUndefined();
  });
});
