import { TemplateService } from '../services/template.service';

describe('TemplateService', () => {
  let service: TemplateService;

  beforeEach(() => {
    service = new TemplateService();
  });

  it('render returns rendered subject and body for user.registered template', () => {
    const result = service.render('user.registered', { phone: '0901234567', role: 'BUYER' });

    expect(result.subject).toBe('Chào mừng bạn đến với GoodGo!');
    expect(result.body).toContain('0901234567');
    expect(result.body).toContain('BUYER');
  });

  it('render returns rendered subject and body for quota.exceeded template', () => {
    const result = service.render('quota.exceeded', { metric: 'listings', used: 10, limit: 10 });

    expect(result.subject).toBe('Bạn đã đạt giới hạn sử dụng');
    expect(result.body).toContain('listings');
    expect(result.body).toContain('10');
  });

  it('render throws error for unknown template key', () => {
    expect(() => service.render('does.not.exist', {})).toThrow(
      'Notification template "does.not.exist" not found',
    );
  });

  it('hasTemplate returns true for existing template', () => {
    expect(service.hasTemplate('user.registered')).toBe(true);
    expect(service.hasTemplate('agent.verified')).toBe(true);
    expect(service.hasTemplate('quota.exceeded')).toBe(true);
  });

  it('hasTemplate returns false for non-existing template', () => {
    expect(service.hasTemplate('unknown.template')).toBe(false);
  });

  it('render returns rendered subject and body for saved_search_alert template', () => {
    const result = service.render('saved_search_alert', {
      userName: 'Nguyễn Văn A',
      searchName: 'Chung cư Quận 7',
      listingTitle: 'Căn hộ 2PN tầng cao view sông',
      listingPrice: '3.500.000.000',
      listingDistrict: 'Quận 7',
      listingCity: 'Hồ Chí Minh',
      listingUrl: '/listings/abc123',
    });

    expect(result.subject).toBe('Tin mới phù hợp tìm kiếm "Chung cư Quận 7"');
    expect(result.body).toContain('Nguyễn Văn A');
    expect(result.body).toContain('Chung cư Quận 7');
    expect(result.body).toContain('Căn hộ 2PN tầng cao view sông');
    expect(result.body).toContain('3.500.000.000 VNĐ');
    expect(result.body).toContain('Quận 7');
    expect(result.body).toContain('/listings/abc123');
  });

  it('render returns rendered subject and body for saved_search_digest template', () => {
    const result = service.render('saved_search_digest', {
      userName: 'Trần Thị B',
      searchName: 'Villa Thủ Đức',
      matchCount: 3,
      listings: [
        { title: 'Villa 1', price: '5.000.000.000', district: 'Thủ Đức', city: 'Hồ Chí Minh', url: '/listings/1' },
        { title: 'Villa 2', price: '7.000.000.000', district: 'Thủ Đức', city: 'Hồ Chí Minh', url: '/listings/2' },
      ],
    });

    expect(result.subject).toBe('3 bất động sản mới khớp tìm kiếm "Villa Thủ Đức"');
    expect(result.body).toContain('Trần Thị B');
    expect(result.body).toContain('Villa Thủ Đức');
    expect(result.body).toContain('3');
    expect(result.body).toContain('Villa 1');
    expect(result.body).toContain('5.000.000.000 VNĐ');
    expect(result.body).toContain('Villa 2');
    expect(result.body).toContain('/listings/1');
    expect(result.body).toContain('/listings/2');
  });

  it('getTemplateKeys returns all 19 template keys', () => {
    const keys = service.getTemplateKeys();

    expect(keys).toHaveLength(19);
    expect(keys).toContain('user.registered');
    expect(keys).toContain('agent.verified');
    expect(keys).toContain('listing.approved');
    expect(keys).toContain('listing.rejected');
    expect(keys).toContain('listing.expiring');
    expect(keys).toContain('inquiry.received');
    expect(keys).toContain('quota.exceeded');
    expect(keys).toContain('password.reset');
    expect(keys).toContain('payment.confirmed');
    expect(keys).toContain('subscription.expiring');
    expect(keys).toContain('saved_search_alert');
    expect(keys).toContain('saved_search_digest');
    expect(keys).toContain('user.email_change_otp');
    expect(keys).toContain('user.phone_change_otp');
    expect(keys).toContain('user.phone_login_otp');
    expect(keys).toContain('inquiry.reply');
    expect(keys).toContain('listing.price_drop');
    expect(keys).toContain('subscription.renewal');
    expect(keys).toContain('subscription.renewed');
  });
});
