export type TemplateParameterType =
  | "text"
  | "currency"
  | "date_time"
  | "image"
  | "document"
  | "video";

export interface TemplateTextParameter {
  type: "text";
  text: string;
}

export interface TemplateCurrencyParameter {
  type: "currency";
  currency: {
    fallback_value: string;
    code: string;
    amount_1000: number;
  };
}

export interface TemplateDateTimeParameter {
  type: "date_time";
  date_time: {
    fallback_value: string;
  };
}

export interface TemplateMediaParameter {
  type: "image" | "document" | "video";
  image?: { link: string; caption?: string | undefined; filename?: string | undefined } | undefined;
  document?: { link: string; caption?: string | undefined; filename?: string | undefined } | undefined;
  video?: { link: string; caption?: string | undefined; filename?: string | undefined } | undefined;
}

export type TemplateParameter =
  | TemplateTextParameter
  | TemplateCurrencyParameter
  | TemplateDateTimeParameter
  | TemplateMediaParameter
  | { type: string;[key: string]: any };

export interface TemplateComponent {
  type: "header" | "body" | "button";
  sub_type?: "url" | "quick_reply" | undefined;
  index?: string | number | undefined;
  parameters?: TemplateParameter[] | undefined;
}

export interface SendTemplateParams {
  to: string;
  userName?: string | undefined;
  templateName?: string | undefined;
  campaignName?: string | undefined;
  languageCode?: string | undefined;
  parameters?: TemplateParameter[] | undefined;
  components?: TemplateComponent[] | undefined;
  templateParams?: string[] | undefined;
}

export interface SendDeliveryUpdateParams {
  phone: string;
  customerName: string;
  orderNumber: string;
  deliveryDate: string;
  deliveryTime: string;
  languageCode?: string | undefined;
}

export interface SendCustomerPaymentReceivedParams {
  phone: string;
  customerName: string;
  paymentAmount: string | number;
  paymentDate: string;
  remainingBalance: string | number;
  languageCode?: string | undefined;
}

export interface WhatsAppServiceResult<T = any> {
  success: boolean;
  data?: T | undefined;
  error?: string | undefined;
  messageId?: string | undefined;
}

export interface WhatsAppConfig {
  apiUrl: string;
  apiKey: string;
  phoneNumberId?: string | undefined;
}

// this for supplier payment message sends type.
export interface SendSupplierPaymentMessageParams {
  phone: string;
  supplierName: string;
  paymentAmount: string | number;
  paymentDate: string;
  paymentMode: string;
  referenceNumber: string;
  remainingBalance: string | number;
  languageCode?: string | undefined;
}

// this for supplier box return message sends type.
export interface SendSupplierBoxReturnMessageParams {
  phone: string;
  supplierName: string;
  totalBoxesPurchased: string | number;
  vegetableName: string;
  returnedBoxes: string | number;
  retainedBoxes: string | number;
  languageCode?: string | undefined;
}

// Type for invoice ready notification sent to customer after sale creation.
export interface SendInvoiceReadyParams {
  phone: string;
  customerName: string;
  invoiceNo: string;
  invoiceAmount: string | number;   // {{3}} — e.g. "12500.00"
  invoiceUuid?: string | undefined; // {{4}} — UUID e.g. "b1a49200-ab00-11f1-9aa5-00163e99ceb8"
  invoiceUrl?: string | undefined;  // public URL or download token
  languageCode?: string | undefined;
}

