import { Injectable } from '@nestjs/common';
import Handlebars from 'handlebars';

export interface TemplateDefinition {
  subject: string;
  body: string;
}

export interface RenderedTemplate {
  subject: string;
  body: string;
}

const TEMPLATES: Record<string, TemplateDefinition> = {
  'user.registered': {
    subject: 'Chào mừng bạn đến với GoodGo!',
    body: `<h1>Xin chào {{phone}}!</h1>
<p>Cảm ơn bạn đã đăng ký tài khoản GoodGo với vai trò <strong>{{role}}</strong>.</p>
<p>Bạn có thể bắt đầu khám phá bất động sản ngay bây giờ.</p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'agent.verified': {
    subject: 'Tài khoản Đại lý đã được xác minh',
    body: `<h1>Chúc mừng!</h1>
<p>Tài khoản đại lý của bạn (ID: {{agentId}}) đã được xác minh thành công.</p>
<p>Bạn có thể bắt đầu đăng tin bất động sản ngay bây giờ.</p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'listing.approved': {
    subject: 'Tin đăng đã được duyệt',
    body: `<h1>Tin đăng được phê duyệt!</h1>
<p>Tin đăng <strong>{{listingTitle}}</strong> của bạn đã được duyệt và hiển thị trên GoodGo.</p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'inquiry.received': {
    subject: 'Bạn có yêu cầu tư vấn mới',
    body: `<h1>Yêu cầu tư vấn mới</h1>
<p>Bạn nhận được yêu cầu tư vấn từ <strong>{{senderName}}</strong> cho tin đăng <strong>{{listingTitle}}</strong>.</p>
<p>Nội dung: {{message}}</p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'quota.exceeded': {
    subject: 'Bạn đã đạt giới hạn sử dụng',
    body: `<h1>Giới hạn đã đạt</h1>
<p>Bạn đã sử dụng hết giới hạn <strong>{{metric}}</strong> ({{used}}/{{limit}}).</p>
<p>Vui lòng nâng cấp gói để tiếp tục sử dụng dịch vụ.</p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'password.reset': {
    subject: 'Đặt lại mật khẩu GoodGo',
    body: `<h1>Đặt lại mật khẩu</h1>
<p>Bạn đã yêu cầu đặt lại mật khẩu. Sử dụng mã OTP sau: <strong>{{otp}}</strong></p>
<p>Mã có hiệu lực trong {{expiryMinutes}} phút.</p>
<p>Nếu bạn không yêu cầu, hãy bỏ qua email này.</p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'listing.rejected': {
    subject: 'Tin đăng không được duyệt',
    body: `<h1>Tin đăng bị từ chối</h1>
<p>Tin đăng <strong>{{listingTitle}}</strong> của bạn không được duyệt.</p>
<p>Lý do: {{reason}}</p>
<p>Vui lòng chỉnh sửa và gửi lại tin đăng.</p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'payment.confirmed': {
    subject: 'Xác nhận thanh toán thành công',
    body: `<h1>Thanh toán thành công!</h1>
<p>Giao dịch <strong>{{paymentId}}</strong> đã được xử lý thành công.</p>
<p>Số tiền: <strong>{{amountVND}} VNĐ</strong></p>
<p>Phương thức: {{provider}}</p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'subscription.expiring': {
    subject: 'Gói đăng ký sắp hết hạn',
    body: `<h1>Gói đăng ký đã bị huỷ</h1>
<p>Gói <strong>{{planTier}}</strong> của bạn đã bị huỷ.</p>
<p>Bạn có thể đăng ký lại bất cứ lúc nào để tiếp tục sử dụng đầy đủ tính năng.</p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
};

@Injectable()
export class TemplateService {
  private compiledTemplates = new Map<string, { subject: Handlebars.TemplateDelegate; body: Handlebars.TemplateDelegate }>();

  constructor() {
    for (const [key, def] of Object.entries(TEMPLATES)) {
      this.compiledTemplates.set(key, {
        subject: Handlebars.compile(def.subject),
        body: Handlebars.compile(def.body),
      });
    }
  }

  render(templateKey: string, data: Record<string, unknown>): RenderedTemplate {
    const compiled = this.compiledTemplates.get(templateKey);
    if (!compiled) {
      throw new Error(`Notification template "${templateKey}" not found`);
    }
    return {
      subject: compiled.subject(data),
      body: compiled.body(data),
    };
  }

  hasTemplate(templateKey: string): boolean {
    return this.compiledTemplates.has(templateKey);
  }

  getTemplateKeys(): string[] {
    return Array.from(this.compiledTemplates.keys());
  }
}
