import axios from "axios";
import { whatsappLog } from "../../serviceLog";
import clientConfigDB from "../model/clientConfig.model";
import CONSTANTS from "../../../config/constants";
import whatsAppTemplateDB from "../model/whatsappTemplate.model";

const getClientWhatsappCredentials = async (
  clientId: number,
  propId: number
) => {
  let F = "Cred Interakt";
  try {
    let whatsAppKey = process.env.WHATSAPP_API_KEY;
    if(0 === clientId){
      let data = {
        key: whatsAppKey,
      }
      return data;
    }
    let whatsAppCredType = "DEFAULT";
    let whatsAppCred = await clientConfigDB.getClientConfigByPropId({
      clientId,
      propId,
      provider: CONSTANTS.CLIENT_CONFIG_PROVIDER.INTERACT,
      type: CONSTANTS.CLIENT_CONFIG_TYPE.KEY
    });
    if(whatsAppCred) {
      whatsAppCredType = "PROPERTY";
      whatsAppKey = `Basic ${whatsAppCred?.value}`
    } else {
        whatsAppCred = await clientConfigDB.getClientConfig(
        {
          clientId,
          provider: CONSTANTS.CLIENT_CONFIG_PROVIDER.INTERACT,
          type: CONSTANTS.CLIENT_CONFIG_TYPE.KEY
        });
        if(whatsAppCred) {
          whatsAppCredType = "CLIENT";
          whatsAppKey = `Basic ${whatsAppCred?.value}`
        }   
    }
    if( "CLIENT" === whatsAppCredType) {
        whatsappLog.info(
          `[${F}], Client Id [${clientId}], using client credentials`
        );
    } else if("PROPERTY" === whatsAppCredType) {
      whatsappLog.info(
        `[${F}], Client Id [${clientId}], Prop Id [${propId}], Using client property credentials`
      );
    } else {
      whatsappLog.info(
        `[${F}], Client Id [${clientId}], Using default Kipinn credentials.`
      );
    }
    let data = {
      key: whatsAppKey,
    }
    return data;
  } catch (error: any) {
    whatsappLog.info(
      `[GET Whatsapp Credentails], Client Id [${clientId}], Prop Id [${propId}], Error: ${JSON.stringify(error)}`
    );
    let data = {
      key: process.env.WHATSAPP_API_KEY,
    }
    return data;
  }
};

export const getClientWhatsappCredentialsChatMitra = async (
  clientId: number,
  propId: number,
  templateType: number = 0,
  userType : number = CONSTANTS.USER_TYPE.TENANT
) => {
  let F = "WhatsApp Credentials Chat Mitra";
  try {
    let templateName = "";
    let lang = "";
    let whatsAppKey = "";
    let templateData = await whatsAppTemplateDB.getByClientAndType({clientId,
      provider: CONSTANTS.CLIENT_CONFIG_PROVIDER.CHAT_MITRA,
      type: templateType,
      userType
    });
    if(!templateData) {
      whatsappLog.info(`[${F}], Client Id [${clientId}], Template Type [${templateType}], failed to get templateData`);
      return false;
    } else {
      templateName = templateData['templateId'];
      lang = templateData['languageCode'];
    }

    let whatsAppCredType = "DEFAULT";
    let whatsAppCred = await clientConfigDB.getClientConfigByPropId({
      clientId,
      propId,
      provider: CONSTANTS.CLIENT_CONFIG_PROVIDER.CHAT_MITRA,
      type: CONSTANTS.CLIENT_CONFIG_TYPE.KEY
    });
    if(whatsAppCred) {
      whatsAppCredType = "PROPERTY";
      whatsAppKey = `Bearer ${whatsAppCred?.value}`
    } else {
        whatsAppCred = await clientConfigDB.getClientConfig(
        {
          clientId,
          provider: CONSTANTS.CLIENT_CONFIG_PROVIDER.CHAT_MITRA,
          type: CONSTANTS.CLIENT_CONFIG_TYPE.KEY
        });
        if(whatsAppCred) {
          whatsAppCredType = "CLIENT";
          whatsAppKey = `Bearer ${whatsAppCred?.value}`
        }   
    }
    if( "CLIENT" === whatsAppCredType) {
        whatsappLog.info(
          `[${F}], Client Id [${clientId}], using client credentials`
        );
    } else if("PROPERTY" === whatsAppCredType) {
      whatsappLog.info(
        `[${F}], Client Id [${clientId}], Prop Id [${propId}], Using client property credentials`
      );
    } else {
      return false;
    }
    let data = {
      key: whatsAppKey,
      templateName: templateName,
      languageCode: lang,
    }
    return data;
  } catch (error: any) {
    whatsappLog.info(
      `[${F}], Client Id [${clientId}], Prop Id [${propId}], Error: ${JSON.stringify(error)}`
    );

    return false;
  }
};

export const getClientWhatsappCredentialsMessageCentral = async (
  clientId: number,
  propId: number,
) => {
  let F = "WhatsApp Credentials Messsage Central";
  try {
    let whatsAppKey = process.env.WHATSAPP_API_KEY_MC;

    let whatsAppCredType = "DEFAULT";
    let whatsAppCred = await clientConfigDB.getClientConfigByPropId({
      clientId,
      propId,
      provider: CONSTANTS.CLIENT_CONFIG_PROVIDER.MESSAGE_CENTRAL,
      type: CONSTANTS.CLIENT_CONFIG_TYPE.KEY
    });
    if(whatsAppCred) {
      whatsAppCredType = "PROPERTY";
      whatsAppKey = `${whatsAppCred?.value}`
    } else {
        whatsAppCred = await clientConfigDB.getClientConfig(
        {
          clientId,
          provider: CONSTANTS.CLIENT_CONFIG_PROVIDER.MESSAGE_CENTRAL,
          type: CONSTANTS.CLIENT_CONFIG_TYPE.KEY
        });
        if(whatsAppCred) {
          whatsAppCredType = "CLIENT";
          whatsAppKey = `${whatsAppCred?.value}`
        }   
    }
    if( "CLIENT" === whatsAppCredType) {
        whatsappLog.info(
          `[${F}], Client Id [${clientId}], using client credentials`
        );
    } else if("PROPERTY" === whatsAppCredType) {
      whatsappLog.info(
        `[${F}], Client Id [${clientId}], Prop Id [${propId}], Using client property credentials`
      );
    } else {
      whatsappLog.info(
        `[${F}], Client Id [${clientId}], Prop Id [${propId}], Using Default Kipinn credentials`
      );
    }
    let data = {
      key: whatsAppKey,
    }
    return data;
  } catch (error: any) {
    whatsappLog.info(
      `[${F}], Client Id [${clientId}], Prop Id [${propId}], Error: ${JSON.stringify(error)}`
    );

    return false;
  }
};

export const getClientWhatsappCredentialsDirectMeta = async (
  clientId: number,
  propId: number,
) => {
  let F = "WhatsApp Credentials Meta";
  try {
    let whatsAppKey = process.env.WHATSAPP_API_KEY_META;

    let whatsAppCredType = "DEFAULT";
    let whatsAppCred = await clientConfigDB.getClientConfigByPropId({
      clientId,
      propId,
      provider: CONSTANTS.CLIENT_CONFIG_PROVIDER.WHATSAPP_META,
      type: CONSTANTS.CLIENT_CONFIG_TYPE.KEY
    });
    if(whatsAppCred) {
      whatsAppCredType = "PROPERTY";
      whatsAppKey = `${whatsAppCred?.value}`
    } else {
        whatsAppCred = await clientConfigDB.getClientConfig(
        {
          clientId,
          provider: CONSTANTS.CLIENT_CONFIG_PROVIDER.WHATSAPP_META,
          type: CONSTANTS.CLIENT_CONFIG_TYPE.KEY
        });
        if(whatsAppCred) {
          whatsAppCredType = "CLIENT";
          whatsAppKey = `${whatsAppCred?.value}`
        }   
    }
    if( "CLIENT" === whatsAppCredType) {
        whatsappLog.info(
          `[${F}], Client Id [${clientId}], using client credentials`
        );
    } else if("PROPERTY" === whatsAppCredType) {
      whatsappLog.info(
        `[${F}], Client Id [${clientId}], Prop Id [${propId}], Using client property credentials`
      );
    } else {
      whatsappLog.info(
        `[${F}], Client Id [${clientId}], Prop Id [${propId}], Using Default Kipinn credentials`
      );
    }
    let data = {
      key: whatsAppKey,
    }
    return data;
  } catch (error: any) {
    whatsappLog.info(
      `[${F}], Client Id [${clientId}], Prop Id [${propId}], Error: ${JSON.stringify(error)}`
    );

    return false;
  }
};

export default getClientWhatsappCredentials;
