/*
 * (c) 2020 Pluto Inc.
 */
package tv.pluto.mongo.utils;

import static com.mongodb.client.model.Projections.fields;
import static com.mongodb.client.model.Projections.include;

import com.mongodb.BasicDBObject;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.bson.types.ObjectId;
import tv.pluto.mongo.entities.partners.Partners;

public class PartnersUtils extends MongoUtils {

  public PartnersUtils() {
    this.genericCollection = this.collectionPartners;
    this.setContentFeedsDates();
  }

  /**
   * Get list of random partners ids
   *
   * @return list of ids
   */
  public List<String> getRandomPartnerIds() {
    return getDocuments(MongoUtils.LIMIT).stream()
        .map(partner -> ((Partners) partner).getId().toString())
        .collect(Collectors.toList());
  }

  /**
   * Get list of partners ids
   *
   * @param partners partners list
   * @return list of ids
   */
  public List<String> getPartnersIds(List<Partners> partners) {
    return partners.stream().map(Partners::getId).collect(Collectors.toList());
  }

  /**
   * Get partner with existing comScore.c3
   *
   * @return partner with comScore.c3
   */
  public Partners getPartnerWithComScore() {
    BasicDBObject query = new BasicDBObject();
    query.append("comScore.c3", new BasicDBObject("$exists", true));
    return collectionPartners.find(query).first();
  }

  /**
   * Get partner with existing comScore.c3
   *
   * @return partner with comScore.c3
   */
  public List<ObjectId> getIdsPartnersWithComScore() {
    List<ObjectId> result = new ArrayList<>();
    BasicDBObject query = new BasicDBObject();
    query.append("comScore.c3", new BasicDBObject("$exists", true));
    collectionPartners
        .find(query)
        .projection(fields(include("_id")))
        .limit(MongoUtils.LIMIT)
        .forEach(partner -> result.add(new ObjectId(partner.getId())));
    return result;
  }

  /**
   * Get partner with existing comScore.c3
   *
   * @return partner with comScore.c3
   */
  public List<Partners> getPartnersWithoutComScore() {
    List<Partners> partners = new ArrayList<>();
    BasicDBObject query = new BasicDBObject();
    query.append("comScore", new BasicDBObject("$exists", false));
    collectionPartners.find(query).forEach(partners::add);
    return partners;
  }
}
