import MatrixClientPeg from '../MatrixClientPeg';

/**
 * Get all widgets (user and room) for the current user
 * @param  {object} room The room to get widgets for
 * @return {[object]} Array containing current / active room and user widget state events
 */
function getWidgets(room) {
    const widgets = getRoomWidgets(room);
    widgets.concat(getUserWidgetsArray());
    return widgets;
}

/**
 * Get room specific widgets
 * @param  {object} room The room to get widgets force
 * @return {[object]} Array containing current / active room widgets
 */
function getRoomWidgets(room) {
    const appsStateEvents = room.currentState.getStateEvents('im.vector.modular.widgets');
    if (!appsStateEvents) {
        return [];
    }

    return appsStateEvents.filter((ev) => {
        return ev.getContent().type && ev.getContent().url;
    });
}

/**
 * Get user specific widgets (not linked to a specific room)
 * @return {object} Event content object containing current / active user widgets
 */
function getUserWidgets() {
    const client = MatrixClientPeg.get();
    if (!client) {
        throw new Error('User not logged in');
    }
    const userWidgets = client.getAccountData('m.widgets');
    let userWidgetContent = {};
    if (userWidgets && userWidgets.getContent()) {
      userWidgetContent = userWidgets.getContent();
    }
    return userWidgetContent;
}

/**
 * Get user specific widgets (not linked to a specific room) as an array
 * @return {[object]} Array containing current / active user widgets
 */
function getUserWidgetsArray() {
  return Object.values(getUserWidgets());
}

/**
 * Get active stickerpicker widgets (stickerpickers are user widgets by nature)
 * @return {[object]} Array containing current / active stickerpicker widgets
 */
function getStickerpickerWidgets() {
    const widgets = getUserWidgetsArray();
    const stickerpickerWidgets = widgets.filter((widget) => widget.type='m.stickerpicker');
    return stickerpickerWidgets;
}

/**
 * Remove all stickerpicker widgets (stickerpickers are user widgets by nature)
 */
function removeStickerpickerWidgets() {
    const client = MatrixClientPeg.get();
    if (!client) {
        throw new Error('User not logged in');
    }
    const userWidgets = client.getAccountData('m.widgets').getContent() || {};
    Object.entries(userWidgets).forEach(([key, widget]) => {
        if (widget.type === 'm.stickerpicker') {
            delete userWidgets[key];
        }
    });
    client.setAccountData('m.widgets', userWidgets);
}


export default {
    getWidgets,
    getRoomWidgets,
    getUserWidgets,
    getUserWidgetsArray,
    getStickerpickerWidgets,
    removeStickerpickerWidgets,
};

import MatrixClientPeg from '../MatrixClientPeg';

/**
 * Get all widgets (user and room) for the current user
 * @param  {object} room The room to get widgets for
 * @return {[object]} Array containing current / active room and user widget state events
 */
function getWidgets(room) {
    const widgets = getRoomWidgets(room);
    widgets.concat(getUserWidgetsArray());
    return widgets;
}

/**
 * Get room specific widgets
 * @param  {object} room The room to get widgets force
 * @return {[object]} Array containing current / active room widgets
 */
function getRoomWidgets(room) {
    const appsStateEvents = room.currentState.getStateEvents('im.vector.modular.widgets');
    if (!appsStateEvents) {
        return [];
    }

    return appsStateEvents.filter((ev) => {
        return ev.getContent().type && ev.getContent().url;
    });
}

/**
 * Get user specific widgets (not linked to a specific room)
 * @return {object} Event content object containing current / active user widgets
 */
function getUserWidgets() {
    const client = MatrixClientPeg.get();
    if (!client) {
        throw new Error('User not logged in');
    }
    const userWidgets = client.getAccountData('m.widgets');
    let userWidgetContent = {};
    if (userWidgets && userWidgets.getContent()) {
      userWidgetContent = userWidgets.getContent();
    }
    return userWidgetContent;
}

/**
 * Get user specific widgets (not linked to a specific room) as an array
 * @return {[object]} Array containing current / active user widgets
 */
function getUserWidgetsArray() {
  return Object.values(getUserWidgets());
}

/**
 * Get active stickerpicker widgets (stickerpickers are user widgets by nature)
 * @return {[object]} Array containing current / active stickerpicker widgets
 */
function getStickerpickerWidgets() {
    const widgets = getUserWidgetsArray();
    const stickerpickerWidgets = widgets.filter((widget) => widget.type='m.stickerpicker');
    return stickerpickerWidgets;
}

/**
 * Remove all stickerpicker widgets (stickerpickers are user widgets by nature)
 */
function removeStickerpickerWidgets() {
    const client = MatrixClientPeg.get();
    if (!client) {
        throw new Error('User not logged in');
    }
    const userWidgets = client.getAccountData('m.widgets').getContent() || {};
    Object.entries(userWidgets).forEach(([key, widget]) => {
        if (widget.type === 'm.stickerpicker') {
            delete userWidgets[key];
        }
    });
    return client.setAccountData('m.widgets', userWidgets);
}


export default {
    getWidgets,
    getRoomWidgets,
    getUserWidgets,
    getUserWidgetsArray,
    getStickerpickerWidgets,
    removeStickerpickerWidgets,
};

Return promise