import CryptoJS from "crypto-js";
import uuid from 'react-uuid'
import { devUrl, prodUrl, stagUrl } from "../constants/envVariables";


const getPaymentModeByName = (value: string, data: { [key: string]: any }) => {
    const objData: { [key: string]: any } = {
        debit_card: 1,
        credit_card: 2,
        net_banking: 3,
        cash: 4,
        neft_rtgs: 5,
        upi: 6,
        wallet: 7,
        bhim_upi_qr: 8,
        rupay_card: 12,
        rtgs: 13,
        imps: 10
    }

    return data.filter((obj: any) => obj.paymodeId == (objData[value]));
}
const encryptAES = (message: string, object: any) => {

    let encObj: any = {};
    for (const key in object) {
        encObj[key] = CryptoJS.AES.encrypt(object[key], "sabpaisa").toString()
    }
    return encObj;
}

const encrypt = function (plain_text: any, secret: any, ivString: any) {

    const msg = plain_text;

    // key & iv - 128-bit (16 byte)
    const key = CryptoJS.enc.Utf8.parse(secret);
    const iv = CryptoJS.enc.Utf8.parse(ivString);

    // AES-128
    const enc = CryptoJS.AES.encrypt(msg, key, {
        iv,
        mode: CryptoJS.mode.CBC,
    }).ciphertext.toString(CryptoJS.enc.Base64);
    return enc;
}

const encryptAESString = (data: string, authkey: string, authiv: string): string => {
    let encData = encrypt(data, authkey, authiv);

    return encData;
}

const decrypt = function (plain_text: any, encryptionMethod: any, secret: any, ivString: any) {

    const msg = plain_text;

    // key & iv - 128-bit (16 byte)
    const key = CryptoJS.enc.Utf8.parse(secret);
    const iv = CryptoJS.enc.Utf8.parse(ivString);

    // AES-128
    const dec = CryptoJS.AES.decrypt(msg, key, {
        iv,
        mode: CryptoJS.mode.CBC,
    });
    return dec.toString(CryptoJS.enc.Utf8);
}
const decAESString = (data: string, authkey: string, authiv: string): string => {
    let decData = decrypt(data, "aes-128-cbc", authkey, authiv);

    return decData;
}
const getUUID = () => {
    return uuid();
}

const getPaymentUrl = (env: string = ""): string => {
    let finalUrl: string = "";
    switch (env) {
        case "dev":
            finalUrl = devUrl;
            break;
        case "stag":
            finalUrl = stagUrl;
            break;
        case "prod":
            finalUrl = prodUrl;
            break;
        default:
            finalUrl = devUrl;
            break;
    }
    return finalUrl;
}

export { getPaymentModeByName, encryptAES, encryptAESString, getUUID, decAESString, getPaymentUrl };
