/**
 * Notification template type scaffold for SMS, email, and push channels.
 * Template bodies live in the backend NotificationTemplate model; this module
 * defines IDs and variable contracts consumed by the BFF and core-api.
 */

export type NotificationChannel = "sms" | "email" | "push" | "webhook";

export type NotificationTemplateId =
  | "otp_code"
  | "onboarding_step_reminder"
  | "case_status_update"
  | "case_approved"
  | "case_rejected"
  | "document_request"
  | "agent_visit_scheduled";

export interface NotificationTemplateDefinition {
  id: NotificationTemplateId;
  channel: NotificationChannel;
  description: string;
  /** Variable keys required when rendering this template */
  requiredVariables: string[];
  /** Optional locale-specific body preview for dev/docs */
  preview?: Record<string, string>;
}

export interface RenderedNotification {
  templateId: NotificationTemplateId;
  channel: NotificationChannel;
  recipient: string;
  locale: string;
  body: string;
  variables: Record<string, string>;
}

const TEMPLATE_REGISTRY: NotificationTemplateDefinition[] = [
  {
    id: "otp_code",
    channel: "sms",
    description: "OTP verification code for farmer login",
    requiredVariables: ["code", "expiresMinutes"],
    preview: { uz: "AGNET tasdiqlash kodi: {{code}}. {{expiresMinutes}} daqiqa amal qiladi." },
  },
  {
    id: "case_status_update",
    channel: "sms",
    description: "Finance case moved to a new review stage",
    requiredVariables: ["caseId", "status", "institutionName"],
  },
  {
    id: "case_approved",
    channel: "sms",
    description: "Finance case approved by institution",
    requiredVariables: ["caseId", "institutionName", "amountUzs"],
  },
  {
    id: "case_rejected",
    channel: "sms",
    description: "Finance case rejected with reason code",
    requiredVariables: ["caseId", "reasonCode"],
  },
  {
    id: "document_request",
    channel: "sms",
    description: "Additional documents requested during review",
    requiredVariables: ["caseId", "docTypes"],
  },
  {
    id: "onboarding_step_reminder",
    channel: "sms",
    description: "Nudge to resume incomplete onboarding",
    requiredVariables: ["stepName", "resumeUrl"],
  },
  {
    id: "agent_visit_scheduled",
    channel: "sms",
    description: "Field agent GIS mapping visit scheduled",
    requiredVariables: ["visitDate", "agentPhone"],
  },
];

export function listNotificationTemplates(): NotificationTemplateDefinition[] {
  return [...TEMPLATE_REGISTRY];
}

export function getNotificationTemplate(
  id: NotificationTemplateId,
): NotificationTemplateDefinition | undefined {
  return TEMPLATE_REGISTRY.find((t) => t.id === id);
}

/** Simple mustache-style {{var}} substitution for dev previews only. */
export function renderNotificationPreview(
  template: NotificationTemplateDefinition,
  locale: string,
  variables: Record<string, string>,
): string {
  const body = template.preview?.[locale] ?? template.preview?.uz ?? "";
  return body.replace(/\{\{(\w+)\}\}/g, (_, key: string) => variables[key] ?? `{{${key}}}`);
}
