import type {
  TemplateComponent,
  TemplateParameter,
  SendDeliveryUpdateParams,
  SendCustomerPaymentReceivedParams,
  SendSupplierPaymentMessageParams,
  SendSupplierBoxReturnMessageParams,
  SendInvoiceReadyParams,
} from "./whatsapp.types.js";

/**
 * WhatsApp Campaign Name Constants
 * Matches live campaigns configured in SmartPing API dashboard.
 */
export const WHATSAPP_TEMPLATES = {
  CUSTOMER_PAY: "CUSTOMER_PAY",
  CUSTOMER_PAY_RECEIVE: "CUSTOMER_PAY_RECEIVE",
  BILLING: "BILLING",
  BOX_RETURN: "BOX_RETURN",

  // Aliases for backward compatibility
  INVOICE_READY: "CUSTOMER_PAY",
  CUSTOMER_PAYMENT_RECEIVED: "CUSTOMER_PAY_RECEIVE",
  SUPPLIER_PAYMENT_MESSAGE: "BILLING",
  BOX_RETURN_SUPPLIER: "BOX_RETURN",
  DELIVERY_UPDATE: "delivery_update_2",
} as const;

/**
 * Formats parameters for the `delivery_update_2` template:
 * {{1}} = Customer Name
 * {{2}} = Order Number
 * {{3}} = Delivery Date
 * {{4}} = Delivery Time
 */
export function buildDeliveryUpdateComponents(
  params: SendDeliveryUpdateParams
): TemplateComponent[] {
  const parameters: TemplateParameter[] = [
    { type: "text", text: String(params.customerName ?? "-") },
    { type: "text", text: String(params.orderNumber ?? "-") },
    { type: "text", text: String(params.deliveryDate ?? "-") },
    { type: "text", text: String(params.deliveryTime ?? "-") },
  ];

  return [
    {
      type: "body",
      parameters,
    },
  ];
}

/**
 * Formats template parameters for `CUSTOMER_PAY_RECEIVE` (customer_payment_received_67spn) in SmartPing:
 *
 * Template:
 *   வணக்கம் {{1}},
 *   தங்களுடைய ₹{{2}} பணத்தை {{3}} அன்று பெற்றுக் கொண்டோம்.
 *   தங்களுடைய பாக்கி தொகை ₹{{4}}.
 *   நன்றி, AVS
 *
 * Variables:
 *   {{1}} = Customer Name
 *   {{2}} = Payment Amount
 *   {{3}} = Payment Date
 *   {{4}} = Remaining Outstanding Balance
 */
export function buildCustomerPaymentReceivedTemplateParams(
  params: SendCustomerPaymentReceivedParams
): string[] {
  const amountStr =
    typeof params.paymentAmount === "number"
      ? params.paymentAmount.toFixed(2)
      : !isNaN(Number(params.paymentAmount))
      ? Number(params.paymentAmount).toFixed(2)
      : String(params.paymentAmount ?? "0.00");

  const balanceStr =
    typeof params.remainingBalance === "number"
      ? params.remainingBalance.toFixed(2)
      : !isNaN(Number(params.remainingBalance))
      ? Number(params.remainingBalance).toFixed(2)
      : String(params.remainingBalance ?? "0.00");

  return [
    String(params.customerName ?? "-"),
    amountStr,
    String(params.paymentDate ?? "-"),
    balanceStr,
  ];
}

export function buildCustomerPaymentReceivedComponents(
  params: SendCustomerPaymentReceivedParams
): TemplateComponent[] {
  const templateParams = buildCustomerPaymentReceivedTemplateParams(params);

  return [
    {
      type: "body",
      parameters: templateParams.map((text) => ({ type: "text", text })),
    },
  ];
}


/**
 * Formats template parameters for `BILLING` (supplier_payment_confirmation_tdvyj) template in SmartPing:
 *
 * Template:
 *   வணக்கம் {{1}},
 *
 *   AVS தங்களுக்கு பணம் அனுப்பியுள்ளது.
 *   பணம் விவரங்கள்:
 *
 *   தொகை: ₹{{2}}
 *   பணம் அனுப்பிய தேதி: {{3}}
 *   பணம் அனுப்பிய முறை: {{4}}
 *   குறிப்பு எண்: {{5}}
 *   மீதமுள்ள தொகை: ₹{{6}}
 *
 *   AVS உடன் தங்கள் வணிகத்திற்கு நன்றி.
 *
 * Variables:
 *   {{1}} = Supplier Name
 *   {{2}} = Payment Amount
 *   {{3}} = Payment Date
 *   {{4}} = Payment Mode
 *   {{5}} = Reference Number
 *   {{6}} = Remaining Outstanding Balance
 */
export function buildSupplierPaymentMessageTemplateParams(
  params: SendSupplierPaymentMessageParams
): string[] {
  const amountStr =
    typeof params.paymentAmount === "number"
      ? params.paymentAmount.toFixed(2)
      : !isNaN(Number(params.paymentAmount))
      ? Number(params.paymentAmount).toFixed(2)
      : String(params.paymentAmount ?? "0.00");

  const balanceStr =
    typeof params.remainingBalance === "number"
      ? params.remainingBalance.toFixed(2)
      : !isNaN(Number(params.remainingBalance))
      ? Number(params.remainingBalance).toFixed(2)
      : String(params.remainingBalance ?? "0.00");

  return [
    String(params.supplierName ?? "-"),
    amountStr,
    String(params.paymentDate ?? "-"),
    String(params.paymentMode ?? "-"),
    String(params.referenceNumber ?? "-"),
    balanceStr,
  ];
}

export function buildSupplierPaymentMessageComponents(
  params: SendSupplierPaymentMessageParams
): TemplateComponent[] {
  const templateParams = buildSupplierPaymentMessageTemplateParams(params);

  return [
    {
      type: "body",
      parameters: templateParams.map((text) => ({ type: "text", text })),
    },
  ];
}

/**
 * Formats template parameters for `BOX_RETURN` (box_return_supplier_io5tcm) in SmartPing:
 *
 * Template:
 *   வணக்கம் {{1}},
 *   தங்களிடமிருந்து {{2}} {{3}} பெட்டிகளை வாங்கியுள்ளோம்.
 *   {{4}} காலி பெட்டிகளை தங்களிடம் திருப்பி வழங்குகிறோம். {{5}} பெட்டிகள் எங்களிடம் இருக்கும்.
 *   நன்றி.
 *
 * Variables:
 *   {{1}} = Supplier Name
 *   {{2}} = Total boxes purchased
 *   {{3}} = Vegetable Name
 *   {{4}} = Empty boxes returned
 *   {{5}} = Boxes retained by AVS
 */
export function buildSupplierBoxReturnMessageTemplateParams(
  params: SendSupplierBoxReturnMessageParams
): string[] {
  return [
    String(params.supplierName ?? "-"),
    String(params.totalBoxesPurchased ?? "0"),
    String(params.vegetableName ?? "தக்காளி"),
    String(params.returnedBoxes ?? "0"),
    String(params.retainedBoxes ?? "0"),
  ];
}

export function buildSupplierBoxReturnMessageComponents(
  params: SendSupplierBoxReturnMessageParams
): TemplateComponent[] {
  const templateParams = buildSupplierBoxReturnMessageTemplateParams(params);

  return [
    {
      type: "body",
      parameters: templateParams.map((text) => ({ type: "text", text })),
    },
  ];
}

/**
 * Formats template parameters for the `delivery_update_2` invoice message in SmartPing.
 *
 * Expected WhatsApp message:
 *   வணக்கம் Ravi Kumar,
 *   AVS-ல் தங்களது வாங்குதலுக்கு நன்றி.
 *   தங்களுக்கான விலைப்பட்டியல் INV-20261012-001, ₹12500.00 மதிப்பில் வெற்றிகரமாக உருவாக்கப்பட்டுள்ளது.
 *   உங்களது விலைப்பட்டியலைப் பார்க்கவும் பதிவிறக்கம் செய்யவும் கீழே உள்ள இணைப்பைக் கிளிக் செய்யவும்.
 *   Invoice Download:
 *   https://avs.ammanvegetablestore.com/invoice/b1a49200-ab00-11f1-9aa5-00163e99ceb8
 *   நன்றி, AVS
 *
 * Variable Order:
 *   {{1}} = Customer Name
 *   {{2}} = Invoice Number
 *   {{3}} = Invoice Amount (e.g. "12500.00")
 *   {{4}} = Invoice UUID (e.g. "b1a49200-ab00-11f1-9aa5-00163e99ceb8")
 */
export function buildInvoiceReadyTemplateParams(
  params: SendInvoiceReadyParams
): string[] {
  const invoiceUuid =
    params.invoiceUuid ||
    String(params.invoiceUrl ?? "-").split("/").pop() ||
    "-";

  const amountStr =
    typeof params.invoiceAmount === "number"
      ? params.invoiceAmount.toFixed(2)
      : !isNaN(Number(params.invoiceAmount))
      ? Number(params.invoiceAmount).toFixed(2)
      : String(params.invoiceAmount ?? "0.00");

  return [
    String(params.customerName ?? "Customer"), // {{1}} Customer Name
    String(params.invoiceNo ?? "-"),            // {{2}} Invoice Number
    amountStr,                                  // {{3}} Invoice Amount
    String(invoiceUuid),                        // {{4}} Invoice UUID
  ];
}

export function buildInvoiceReadyComponents(
  params: SendInvoiceReadyParams
): TemplateComponent[] {
  const templateParams = buildInvoiceReadyTemplateParams(params);

  return [
    {
      type: "body",
      parameters: templateParams.map((text) => ({ type: "text", text })),
    },
  ];
}

