// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.

import {ALL_EMOJIS} from 'app/constants/emoji';

export function generateUserProfilesById(userProfiles = []) {
    return userProfiles.reduce((acc, userProfile) => {
        acc[userProfile.id] = userProfile;

        return acc;
    }, []);
}

export function getMissingUserIds(userProfilesById = {}, allUserIds = []) {
    return allUserIds.reduce((acc, userId) => {
        if (!userProfilesById[userId]) {
            acc.push(userId);
        }

        return acc;
    }, []);
}

export function compareReactions(a, b) {
    if (a.count !== b.count) {
        return b.count - a.count;
    }

    return a.name.localeCompare(b.name);
}

export function getReactionsByName(reactions = {}) {
    return Object.values(reactions).reduce((acc, reaction) => {
        const byName = acc[reaction.emoji_name] || [];
        acc[reaction.emoji_name] = [...byName, reaction];

        return acc;
    }, {});
}

export function sortReactionsByName(reactionsByName = {}) {
    return Object.entries(reactionsByName).
        map(([name, reactions]) => ({name, reactions, count: reactions.length})).
        sort(compareReactions);
}

export function sortReactions(reactionsByName = {}) {
    return sortReactionsByName(reactionsByName).
        reduce((acc, {reactions}) => {
            reactions.forEach((r) => acc.push(r));
            return acc;
        }, []);
}

export function getSortedReactionsForHeader(reactionsByName = {}) {
    const sortedReactionsForHeader = sortReactionsByName(reactionsByName);

    const totalCount = sortedReactionsForHeader.reduce((acc, reaction) => {
        return acc + reaction.count;
    }, 0);

    return [{name: ALL_EMOJIS, count: totalCount}, ...sortedReactionsForHeader];
}

export function getUniqueUserIds(reactions = {}) {
    return Object.values(reactions).map((reaction) => reaction.user_id).filter((id, index, arr) => arr.indexOf(id) === index);
}
