import axios from "axios";
import log from "../config/log";
import moment from "moment";
import clientConfigDB from "../models/clientConfig.model";
import CONSTANTS from "../config/constants";
import getClientWhatsappCredentials, { getClientWhatsappCredentialsChatMitra } from "./getClientWhatsappCredentials";
import whatsAppTemplateDB from "../models/whatsappTemplate.model";


const getMessageBody = async (
  clientId: number,
  sendTo: string,
  sendToName: string,
  provider: number = 0,
  bodyValues: any,
  templateName: string,
  languageCode: string = 'en',
  headerValues: any = null
) => {
  const F = "getMessageBody";
  sendToName = sendToName.trim();
  let messageBody: any = []
  let components: any = []
  try { 
    if(headerValues) {
      components.push({
        type: "header",
        parameters: headerValues,
      });
    }
    if(bodyValues) {
      components.push({
        type: "body",
        parameters: bodyValues,
      });
    }
    let formattedMobile = sendTo.trim().replace(" ", "");
    messageBody = {
      recipient_mobile_number: "+91" + formattedMobile.slice(-10),
      customer_name: sendToName,
      messages: [
        {
          kind: "template",
          template: {
            name: templateName,
            language: languageCode,
            components : components,
            // components: [
            //   {
            //     type: "body",
            //     parameters: bodyValues,
            //   }
            // ]
          }
        }
      ]
    };
    return messageBody;
  } catch (error: any) {
    log.info(
      `[${F}], Mobile [${sendTo}], Error: ${
        JSON.stringify(error?.response?.data) || error?.message || error
      }`
    );

    return false;
  }
};

export const sendWhatsapp = async (
  mobile: string,
  tenantName: string,
  clientId: number = 0,
  propId: number = 0,
  bodyValues: any = null,
  templateType: number,
  provider: number = CONSTANTS.CLIENT_CONFIG_PROVIDER.CHAT_MITRA,
  userType: number = CONSTANTS.USER_TYPE.TENANT,
  headerValues: any = null,
) => {
  const F = "sendWhatsapp";
  //footer = footer.replace("Team", "").trim();
  tenantName = tenantName.trim();
  try {
    let credentials = await getClientWhatsappCredentialsChatMitra(clientId, propId, templateType, userType);
    if(!credentials) {
      log.info(
        `[${F}], Client Id [${clientId}], Mobile [${mobile}, Failed to get key`
      );
      return false;
    }

    let messageBody: any = []
    messageBody=  await getMessageBody(clientId, mobile, tenantName, provider, bodyValues, credentials?.templateName, credentials?.languageCode, headerValues);
    const response2: any = await axios.post(
      `${process.env.WHATSAPP_CHAT_MITRA_SEND_MESSAGE_URI}`,
      messageBody,
      {
        timeout: 8000,
        headers: {
          "Content-Type": "application/json",
          Authorization: credentials?.key,
        },
      }
    );
    if (response2?.data?.status === 'success') {
      log.info(
        `[${F}], Mobile [${mobile}], Message sent successfully, Response : ${JSON.stringify(
          response2?.data
        )}`
      );
      return true;
    } else {
      log.info(
        `[${F}], Mobile [${mobile}], Unable to send message, Response : ${JSON.stringify(
          response2?.data
        )}`
      );
      return false;
    }
  } catch (error: any) {
    log.info(
      `[${F}], Mobile [${mobile}], Error: ${
        JSON.stringify(error?.response?.data) || error?.message || error
      }`
    );
    return false;
  }
};

export default sendWhatsapp;
