/*
 * Copyright (c) 2022.
 * Author Peter Placzek (tada5hi)
 * For the full copyright and license information,
 * view the LICENSE file that was distributed with this source code.
 */

import {Context} from "@nuxt/types";
import {Inject} from "@nuxt/types/app";
import {useContactSelfKeyPairStorage, useContactRelatedKeyStorage} from "~/domains/contact/encryption";
import {useChatRoomKeyStorage} from "~/domains/chat-room/encryption";
import {applyContactData, loadAndApplyContactData} from "~/domains/contact-data/utils";
import {changeResponseKeyCase} from "~/modules/api/utils";

export default (ctx : Context, inject : Inject) => {
    // init contact encryption
    const selfKeyStorage : Promise<LocalForage> = useContactSelfKeyPairStorage();
    const relatedKeyStorage : Promise<LocalForage> =  useContactRelatedKeyStorage();

    // init chat room encryption
    const roomKeyStorage : Promise<LocalForage> = useChatRoomKeyStorage();

    if(typeof ctx.store.getters['auth/userId'] === 'undefined') return;

    Promise.all([selfKeyStorage, relatedKeyStorage, roomKeyStorage])
        .then(() => {
            loadAndApplyContactData(ctx.store.getters['auth/userId']).then(r => r);
        });


    const socket = ctx.$socket.use('/');

    socket.on('contactDataCreated', async(payload) => {
        payload = changeResponseKeyCase(payload);

        try {
            await applyContactData(payload.data, ctx.store.getters['auth/userId']);
        } catch (e) {
            console.log(e);
        }
    });

    socket.on('contactCreated', (payload) => {
        payload = changeResponseKeyCase(payload);

        console.log(payload);

        try {
            socket.emit('contactJoin', {
                id: payload.id,
                type: 'contact'
            }, (data) => {
                console.log(data);
            })
        } catch (e) {

        }
    });

    socket.on('contactDeleted', (payload) => {
        payload = changeResponseKeyCase(payload);

        console.log(payload);

        try {
            socket.emit('contactLeave', {
                id: payload.id,
                type: 'contact'
            }, (data) => {
                console.log(data);
            })
        } catch (e) {

        }
    });
}
