/*
 * 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 {ActionTree, GetterTree, MutationTree} from "vuex";
import {RootState} from "~/store/index";

// --------------------------------------------------------------------

export interface ChatState {
    membersOnline: Record<string, any>[]
}

export const state = () : ChatState => ({
    membersOnline: []
});

export const getters : GetterTree<ChatState, RootState> = {
    roomMembersOnline: (state) => (roomId?: string) => {
        return typeof roomId !== 'undefined' ? state.membersOnline.filter(member => member.roomId === roomId) : state.membersOnline;
    },
    roomMemberOnline: (state) => (roomId: string, id: number) => {
        return state.membersOnline.filter(member => member.roomId === roomId && member.id === id);
    }
};

export const actions : ActionTree<ChatState, RootState> = {
    // --------------------------------------------------------------------

    setMembersOnline({commit}, members) {
        commit('setMembersOnline', members);
    },

    // --------------------------------------------------------------------

    addMemberOnline({commit}, member) {
        commit('addMemberOnline', member);
    },

    dropMemberOnline({commit}, member) {
        commit('dropMemberOnline', member);
    },

    // --------------------------------------------------------------------

    dropRoomMemberOnline({commit}, roomId) {
        commit('dropRoomMemberOnline', roomId);
    },
};

export const mutations : MutationTree<ChatState> = {
    setMembersOnline(state, members) {
        state.membersOnline = members;
    },

    // --------------------------------------------------------------------

    addMemberOnline(state, member) {
        const index = state.membersOnline.findIndex(item => item.id === member.id && item.roomId === member.roomId);
        if(index === -1) {
            state.membersOnline.push(member);
        }
    },

    dropMemberOnline(state, member) {
        state.membersOnline = state.membersOnline.filter(item => item.id !== member.id || item.roomId !== member.roomId);
    },

    // --------------------------------------------------------------------

    dropRoomMemberOnline(state, roomId) {
        state.membersOnline = state.membersOnline.filter(item => item.roomId !== roomId);
    }
};

// --------------------------------------------------------------------

export default {
    namespaced: true,
    state,
    getters,
    actions,
    mutations
}
