import { whatsappPendingMessage } from "../model/whatsappMessage.model";
import whatsAppTemplateDB from "../model/whatsappTemplate.model";
import { whatsappLog } from "../../serviceLog";
import CONSTANTS from "../../../config/constants";
import getClientWhatsappCredentials, { getClientWhatsappCredentialsDirectMeta, getClientWhatsappCredentialsMessageCentral } from "../utility/getClientWhatsappCredentials";
import sendWhatsappInterakt from "../utility/intrakt.utility";
import sendWhatsappMC from "../utility/messageCentral.utility";
import sendWhatsappMeta from "../utility/meta.utility";

export async function sendWhatsappMessage(
    message: whatsappPendingMessage
) {

    const payload = message.payload
        ? JSON.parse(message.payload)
        : {};

    whatsappLog.info(`Client Id [${message.clientId}], Prop Id [${message.propId}],Msg ID [${message.id}], Mobile [${message.userMobile}], User Name [${message.userName}], Template type [${message.templateType}], Sending`);

    whatsappLog.info(`Client Id [${message.clientId}], Payload [${payload}]`);
    let clientTemplate = true;
    let template = await whatsAppTemplateDB.getByClientAndType({
        clientId: message.clientId,
        type: message.templateType,
        userType: message.userType
    });
    if (false === template) {
        whatsappLog.info(`Client Id [${message.clientId}], Prop Id [${message.propId}],Msg ID [${message.id}], Mobile [${message.userMobile}], Fetching template under kipinn `);
        template = await whatsAppTemplateDB.getByType({
            type: message.templateType,
            userType: message.userType
        });
        clientTemplate = false;
        if (false === template) {
            whatsappLog.info(`Client Id [${message.clientId}], Prop Id [${message.propId}],Msg ID [${message.id}], Mobile [${message.userMobile}], Template type [${message.templateType}], Not found`);
            return {
                status: false,
                message: "Template not found"
            }
        }
    }
    let provider = template?.provider;
    let templateName = template['templateId'];
    let lang = template['languageCode'] ? template['languageCode'] : "en";
    let projectId = template['projectId'];
    let clientId = message.clientId;
    let propId = Number(message.propId);
    let userMobile = message.userMobile;
    let userName = message.userName;
    let credentials: any;
    let file = null;
    let clientIdParam = clientTemplate ? clientId : 0;
    if (provider === CONSTANTS.CLIENT_CONFIG_PROVIDER.INTERACT) {
        whatsappLog.info(`Client Id [${clientId}], Prop Id [${propId}],Msg ID [${message.id}], Send To Mobile [${userMobile}], Send To Name [${userName}], Template type [${message.templateType}], Provider [${provider}], Template [${templateName}], Lang [${lang}], Sending through interakt`);
        credentials = await getClientWhatsappCredentials(clientId, propId);
        return await sendWhatsappInterakt(
            userMobile,
            userName,
            payload,
            file,
            templateName,
            lang,
            credentials,
            Number(clientIdParam)
        );

    } else if (provider === CONSTANTS.CLIENT_CONFIG_PROVIDER.MESSAGE_CENTRAL) {
        whatsappLog.info(`Client Id [${message.clientId}], Prop Id [${message.propId}],Msg ID [${message.id}], Mobile [${message.userMobile}], Template type [${message.templateType}], Provider [${provider}], Template [${templateName}], Lang [${lang}], Project Id [${projectId}], Sending through message central`);
        credentials = await getClientWhatsappCredentialsMessageCentral(clientId, propId);
        return await sendWhatsappMC(
            userMobile,
            payload,
            file,
            templateName,
            projectId,
            credentials,
            Number(clientIdParam),
        );
    } else if (provider === CONSTANTS.CLIENT_CONFIG_PROVIDER.WHATSAPP_META) {
        whatsappLog.info(`Client Id [${message.clientId}], Prop Id [${message.propId}],Msg ID [${message.id}], Mobile [${message.userMobile}], Template type [${message.templateType}], Provider [${provider}], Template [${templateName}], Lang [${lang}], Project Id [${projectId}], Sending through direct meta`);
        credentials = await getClientWhatsappCredentialsDirectMeta(clientId, propId);
        return await sendWhatsappMeta(
            userMobile,
            payload,
            file,
            templateName,
            lang,
            projectId,
            credentials,
            Number(clientIdParam),
        );
    } else {
        whatsappLog.info(`Client Id [${message.clientId}], Prop Id [${message.propId}],Msg ID [${message.id}], Mobile [${message.userMobile}], Template type [${message.templateType}], Bad Provider`);
        return {
            status: false,
            message: "Provider not found"
        }

    }
}