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>`,
  },
  'listing.expiring': {
    subject: 'Tin đăng sắp hết hạn: {{listingTitle}}',
    body: `<h1>Tin đăng sắp hết hạn</h1>
<p>Tin đăng <strong>{{listingTitle}}</strong> của bạn sẽ hết hạn trong <strong>{{daysRemaining}} ngày</strong> ({{expiresAt}}).</p>
<p>Vui lòng gia hạn tin đăng để tiếp tục 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>`,
  },
  'user.email_change_otp': {
    subject: 'Xác nhận thay đổi email — GoodGo',
    body: `<h1>Xác nhận thay đổi email</h1>
<p>Bạn đã yêu cầu thay đổi email trên GoodGo. Sử dụng mã OTP sau để xác nhận:</p>
<p style="font-size:24px;font-weight:bold;letter-spacing:4px;text-align:center;margin:24px 0;">{{otpCode}}</p>
<p>Mã có hiệu lực trong 10 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>`,
  },
  'user.phone_change_otp': {
    subject: 'Xác nhận thay đổi số điện thoại — GoodGo',
    body: `Mã xác nhận thay đổi số điện thoại GoodGo: {{otpCode}}. Mã có hiệu lực trong 10 phút. Nếu bạn không yêu cầu, hãy bỏ qua tin nhắn này.`,
  },
  'user.phone_login_otp': {
    subject: 'Mã đăng nhập GoodGo',
    body: `Mã đăng nhập GoodGo: {{otpCode}}. Mã có hiệu lực trong 10 phút. Tuyệt đối không chia sẻ mã này với bất kỳ ai.`,
  },
  'saved_search_alert': {
    subject: 'Tin mới phù hợp tìm kiếm "{{searchName}}"',
    body: `<h1>Xin chào {{userName}}!</h1>
<p>Có tin đăng mới phù hợp với tìm kiếm đã lưu <strong>"{{searchName}}"</strong> của bạn:</p>
<table style="width:100%;border-collapse:collapse;margin:16px 0;">
  <tr style="background:#f8f9fa;">
    <td style="padding:12px;border:1px solid #dee2e6;"><strong>{{listingTitle}}</strong></td>
  </tr>
  <tr>
    <td style="padding:12px;border:1px solid #dee2e6;">
      Giá: <strong>{{listingPrice}} VNĐ</strong><br/>
      Khu vực: {{listingDistrict}}, {{listingCity}}
    </td>
  </tr>
</table>
<p><a href="{{listingUrl}}" style="display:inline-block;padding:10px 20px;background:#2563eb;color:#fff;text-decoration:none;border-radius:6px;">Xem chi tiết</a></p>
<p style="color:#6b7280;font-size:14px;">Bạn có thể tắt thông báo cho tìm kiếm này trong phần <a href="/saved-searches">Tìm kiếm đã lưu</a>.</p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'inquiry.reply': {
    subject: 'Phản hồi mới cho yêu cầu tư vấn của bạn',
    body: `<h1>Phản hồi mới từ {{agentName}}</h1>
<p>Bạn nhận được phản hồi cho yêu cầu tư vấn về tin đăng <strong>{{listingTitle}}</strong>.</p>
<p>Nội dung: {{message}}</p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'listing.price_drop': {
    subject: 'Tin đăng đã giảm giá: {{listingTitle}}',
    body: `<h1>Giá đã giảm!</h1>
<p>Tin đăng <strong>{{listingTitle}}</strong> mà bạn đang theo dõi vừa giảm giá.</p>
<p>Giá cũ: <strong>{{oldPriceVND}} VNĐ</strong></p>
<p>Giá mới: <strong>{{newPriceVND}} VNĐ</strong></p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'subscription.renewal': {
    subject: 'Nhắc nhở gia hạn gói {{planTier}}',
    body: `<h1>Gói đăng ký sắp gia hạn</h1>
<p>Gói <strong>{{planTier}}</strong> của bạn sẽ được gia hạn vào <strong>{{renewalDate}}</strong>.</p>
<p>Số tiền dự kiến: <strong>{{amountVND}} VNĐ</strong></p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'subscription.renewed': {
    subject: 'Gói {{planTier}} đã được gia hạn',
    body: `<h1>Gia hạn thành công</h1>
<p>Gói <strong>{{planTier}}</strong> của bạn đã được gia hạn đến <strong>{{periodEnd}}</strong>.</p>
<p>Trân trọng,<br/>Đội ngũ GoodGo</p>`,
  },
  'saved_search_digest': {
    subject: '{{matchCount}} bất động sản mới khớp tìm kiếm "{{searchName}}"',
    body: `<h1>Xin chào {{userName}}!</h1>
<p>Có <strong>{{matchCount}}</strong> bất động sản mới phù hợp với tìm kiếm đã lưu <strong>"{{searchName}}"</strong> của bạn:</p>
<table style="width:100%;border-collapse:collapse;margin:16px 0;">
  {{#each listings}}
  <tr style="{{#if @first}}background:#f8f9fa;{{/if}}">
    <td style="padding:12px;border:1px solid #dee2e6;">
      <strong><a href="{{url}}" style="color:#2563eb;text-decoration:none;">{{title}}</a></strong><br/>
      Giá: <strong>{{price}} VNĐ</strong> · {{district}}, {{city}}
    </td>
  </tr>
  {{/each}}
</table>
<p><a href="/saved-searches" style="display:inline-block;padding:10px 20px;background:#2563eb;color:#fff;text-decoration:none;border-radius:6px;">Xem tất cả kết quả</a></p>
<p style="color:#6b7280;font-size:14px;">Bạn có thể tắt thông báo cho tìm kiếm này trong phần <a href="/saved-searches">Tìm kiếm đã lưu</a>.</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());
  }
}
