import axios from "axios";
import moment from "moment";
import log from "../config/log";

interface CreateLinkParams {
  tenantId: number;
  amount: number;
  firstName: string;
  phone: string | number;
  email?: string;
  productInfo: string;
  surl: string;

  udf1?: string;
  udf2?: string;
  udf3?: string;
  udf4?: string;
  udf5?: string;
}

export const cashfreeCreatePaymentLink = async (params: any) => {
  const {
    tenantId,
    amount,
    firstName,
    phone,
    email,
    productInfo,
    surl,
    udf1,
    udf2,
    udf3,
    udf4,
    udf5,
  } = params;

  const cleanPhone = phone.toString().replace(/\D/g, "").slice(-10);

  if (cleanPhone.length !== 10) {
    throw new Error("Invalid phone number");
  }

  const linkId = `link_${tenantId}_${moment().unix()}`
    .replace(/[^a-zA-Z0-9_-]/g, "")
    .slice(0, 50);

  const payload: any = {
    link_id: linkId,
    link_expiry_time: moment().add(1, "hour").format("YYYY-MM-DDTHH:mm:ssZ"),
    link_amount: Number(amount),
    link_currency: "INR",
    link_purpose: productInfo,

    customer_details: {
      customer_name: firstName,
      customer_phone: cleanPhone,
      ...(email ? { customer_email: email } : {}), // don't send empty string
    },

    link_notes: {
      ...(udf1 && { udf1: String(udf1) }),
      ...(udf2 && { udf2: String(udf2) }),
      ...(udf3 && { udf3: String(udf3) }),
      ...(udf4 && { udf4: String(udf4) }),
      ...(udf5 && { udf5: String(udf5) }),
    },

    // link_meta: {
    //   return_url: surl,
    //   upi_intent: false,
    // },

    link_notify: {
      send_sms: false,
      send_email: false,
    },

    link_auto_reminders: false,
  };

  const options = {
    method: "POST",
    url: `${process.env.CASHFREE_PAYMENT_BASE_URL}/links`,
    headers: {
      "Content-Type": "application/json",
      "x-client-id": process.env.CASHFREE_CLIENTID!,
      "x-client-secret": process.env.CASHFREE_SECRET!,
      "x-api-version": "2025-01-01",
    },
    data: payload,
  };

  try {
    const response = await axios.request(options);

    return {
      isSuccess: true,
      data: response.data,
      paymentLink: response.data?.link_url,
    };
  } catch (err: any) {
    log.info("Cashfree Error:", err.response?.data || err.message);

    return {
      isSuccess: false,
      error: err.response?.data || err.message,
    };
  }
  
};