'use strict';

const config = require('config');

const getArchivePostIds = require('../archives/getArchivePostIds.js');
const curateUser = require('../curate/user.js');
const saveProfileDetails = require('../save/profileDetails.js');

function getUserPostsWrap(reddit, args) {
    return function getUserPosts(usernames) {
        return usernames.reduce((chain, username) => {
            return chain.then(accPosts => {
                return reddit.getUser(username).fetch().then(curateUser).then(saveProfileDetails).then(user => ({
                    user,
                    accPosts
                }));
            }).then(({user, accPosts}) => {
                return reddit.getUser(username).getSubmissions({
                    sort: args.sort,
                    limit: Infinity
                }).then(posts => ({
                    user,
                    accPosts: accPosts.concat(posts)
                }));
            }).then(({user, accPosts}) => {
                if(args.archives || config.fetch.archives.search) {
                    return getArchivePostIds(username, accPosts.map(post => post.id)).then(postIds => {
                        return Promise.all(postIds.map(postId => {
                            return reddit.getSubmission(postId).fetch();
                        }));
                    }).then(archivedPosts => {
                        return {
                            user,
                            accPosts: accPosts.concat(archivedPosts)
                        };
                    });
                }

                return {user, accPosts};
            }).then(({user, accPosts}) => {
                return accPosts.map(post => Object.assign(post, {user}));
            });
        }, Promise.resolve([]));
    };
};

module.exports = getUserPostsWrap;