package com.mongodb.socialite.feed;

import com.mongodb.MongoClientURI;
import com.mongodb.socialite.api.Content;
import com.mongodb.socialite.api.ContentId;
import com.mongodb.socialite.api.User;
import com.mongodb.socialite.configuration.FanoutOnReadConfiguration;
import com.mongodb.socialite.services.ContentService;
import com.mongodb.socialite.services.FeedService;
import com.mongodb.socialite.services.ServiceImplementation;
import com.mongodb.socialite.services.UserGraphService;
import com.yammer.dropwizard.config.Configuration;

import java.util.List;
import java.util.concurrent.TimeUnit;

@ServiceImplementation(
        name = "FanoutOnRead", 
        dependencies = {UserGraphService.class, ContentService.class},
        configClass = FanoutOnReadConfiguration.class)
public class FanoutOnRead implements FeedService {

    private final ContentService content;
    private final UserGraphService usergraph;  
    private final FanoutOnReadConfiguration config;

    public FanoutOnRead(final MongoClientURI dbUri, final UserGraphService usergraph, 
            final ContentService content, final FanoutOnReadConfiguration svcConfig) {
        this.content = content;
        this.usergraph = usergraph;
    	this.config = svcConfig;  	
    }
    
    @Override
        public void post(final User sender, final Content content) {
        // no fanout on write at all, nothing to do !
    }
    
    @Override
        public List<Content> getPostsBy(final User user, final ContentId anchor, final int limit) {
        return this.content.getContentFor(user, anchor, limit);
    }
    
    @Override
    public List<Content> getFeedFor(final User user, final ContentId anchor, final int limit) {
        List<User> following = this.usergraph.getFollowing(user, config.fanout_limit);
        return this.content.getContentFor(following, anchor, limit);
    }    

    @Override
    public Configuration getConfiguration() {
        return this.config;
    }

    @Override
    public List<Content> getPostsBy(User user, int limit) {
        return this.getPostsBy(user, null, limit);
    }

    @Override
    public List<Content> getFeedFor(User user, int limit) {
        return this.getFeedFor(user, null, limit);
    }

    @Override
    public void shutdown(long timeout, TimeUnit unit) {
        // Nothing to do !
    }
}