import MoEAccountMeta from "../models/MoEAccountMeta";
import MoELogoutCompleteData from "../models/MoELogoutCompleteData";
import MoEngagePersimissionResultData from "../models/MoEngagePersimissionResultData";
import UserDeletionData from "../models/UserDeletionData";
import {
    ACCOUNT_META,
    APP_ID,
    IS_USER_DELETION_SUCCESS,
    MOE_DATA,
    MOE_PERMISSION_STATE,
    MOE_PERMISSION_TYPE,
    MOE_PLATFORM
} from "../utils/MoEConstants";

export function getPermissionResult(payload: { [k: string]: any }) {
    return new MoEngagePersimissionResultData(
        payload[MOE_PLATFORM],
        payload[MOE_PERMISSION_STATE],
        payload[MOE_PERMISSION_TYPE]
    )
}

/**
 * Create an instance of {@link MoEAccountMeta} from json object
 * 
 * @param payload - JSON Object with required key
 * @returns instance of {@link MoEAccountMeta}
 * @since 8.6.0
 */
export function getMoEAccountMeta(payload: { [k: string]: any }): MoEAccountMeta {
    return new MoEAccountMeta(payload[APP_ID]);
}

/**
 * Create an instance of {@link UserDeletionData} from json object
 * 
 * @param payload - stringified JSON Object with required key
 * @returns instance of {@link UserDeletionData}
 * @since 8.6.0
 */
export function getUserDeletionData(payload: string): UserDeletionData {
    const payloadJsonObject = JSON.parse(payload);
    return new UserDeletionData(
        getMoEAccountMeta(payloadJsonObject[ACCOUNT_META]),
        payloadJsonObject[MOE_DATA][IS_USER_DELETION_SUCCESS]
    );
}

/**
 * Create an instance of {@link MoELogoutCompleteData} from json object
 *
 * @param payload - JSON Object with required keys
 * @returns instance of {@link MoELogoutCompleteData} or null if parsing fails
 * @since 12.7.0
 */
export function getLogoutCompleteData(payload: { [k: string]: any }): MoELogoutCompleteData | null {
    try {
        return new MoELogoutCompleteData(
            getMoEAccountMeta(payload[ACCOUNT_META]),
            payload[MOE_PLATFORM]
        );
    } catch (e) {
        return null;
    }
}

export function getUserIdentitiesData(payload: string | null): { [k: string]: string } | null {
    if (payload === null) {
        return null;
    }
    const payloadJsonObject: { [k: string]: string } = JSON.parse(payload);
    const mappedIdentities: { [k: string]: string } = {};
    for (let [key, value] of Object.entries(payloadJsonObject)) {
        mappedIdentities[key] = value;
    }
    return mappedIdentities;
}