package com.kickstarter.libs.utils;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.kickstarter.models.Activity;
import com.kickstarter.models.Category;
import com.kickstarter.models.Location;
import com.kickstarter.models.Project;
import com.kickstarter.models.Update;
import com.kickstarter.models.User;
import com.kickstarter.services.DiscoveryParams;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public final class KoalaUtils {
private KoalaUtils() {}
public static @NonNull Map<String, Object> discoveryParamsProperties(final @NonNull DiscoveryParams params) {
return discoveryParamsProperties(params, "discover_");
}
public static @NonNull Map<String, Object> discoveryParamsProperties(final @NonNull DiscoveryParams params, final @NonNull String prefix) {
final Map<String, Object> properties = Collections.unmodifiableMap(new HashMap<String, Object>() {
{
put("staff_picks", params.staffPicks());
put("starred", params.starred());
put("social", params.social());
put("term", params.term());
put("sort", params.sort() != null ? String.valueOf(params.sort()) : "");
put("page", params.page());
put("per_page", params.perPage());
final Category category = params.category();
if (category != null) {
putAll(categoryProperties(category));
}
final Location location = params.location();
if (location != null) {
putAll(locationProperties(location));
}
}
});
return MapUtils.prefixKeys(properties, prefix);
}
public static @NonNull Map<String, Object> categoryProperties(final @NonNull Category category) {
return categoryProperties(category, "category_");
}
public static @NonNull Map<String, Object> categoryProperties(final @NonNull Category category, final @NonNull String prefix) {
final Map<String, Object> properties = new HashMap<String, Object>() {
{
put("id", String.valueOf(category.id()));
put("name", String.valueOf(category.name()));
}
};
return MapUtils.prefixKeys(properties, prefix);
}
public static @NonNull Map<String, Object> locationProperties(final @NonNull Location location) {
return locationProperties(location, "location_");
}
public static @NonNull Map<String, Object> locationProperties(final @NonNull Location location, final @NonNull String prefix) {
final Map<String, Object> properties = new HashMap<String, Object>() {
{
put("id", location.id());
put("name", location.name());
put("displayable_name", location.displayableName());
put("city", location.city());
put("state", location.state());
put("country", location.country());
put("projects_count", location.projectsCount());
}
};
return MapUtils.prefixKeys(properties, prefix);
}
public static @NonNull Map<String, Object> userProperties(final @NonNull User user) {
return userProperties(user, "user_");
}
public static @NonNull Map<String, Object> userProperties(final @NonNull User user, final @NonNull String prefix) {
final Map<String, Object> properties = new HashMap<String, Object>() {
{
put("uid", user.id());
put("backed_projects_count", user.backedProjectsCount());
put("created_projects_count", user.createdProjectsCount());
put("starred_projects_count", user.starredProjectsCount());
}
};
return MapUtils.prefixKeys(properties, prefix);
}
public static @NonNull Map<String, Object> projectProperties(final @NonNull Project project) {
return projectProperties(project, "project_");
}
public static @NonNull Map<String, Object> projectProperties(final @NonNull Project project, final @NonNull String prefix) {
return projectProperties(project, null, prefix);
}
public static @NonNull Map<String, Object> projectProperties(final @NonNull Project project, final @Nullable User loggedInUser, final @NonNull String prefix) {
final Map<String, Object> properties = new HashMap<String, Object>() {
{
put("backers_count", project.backersCount());
put("country", project.country());
put("currency", project.currency());
put("goal", project.goal());
put("pid", project.id());
put("name", project.name());
put("state", project.state());
put("update_count", project.updatesCount());
put("comments_count", project.commentsCount());
put("pledged", project.pledged());
put("percent_raised", project.percentageFunded() / 100.0f);
put("has_video", project.video() != null);
put("hours_remaining", ProjectUtils.timeInSecondsUntilDeadline(project) / 60.0f / 60.0f);
// TODO: Implement `duration`
// put("duration", project.duration());
final Category category = project.category();
if (category != null) {
put("category", category.name());
final Category parent = category.parent();
if (parent != null) {
put("parent_category", parent.name());
}
}
final Location location = project.location();
if (location != null) {
put("location", location.name());
}
putAll(userProperties(project.creator(), "creator_"));
if (loggedInUser != null) {
put("user_is_project_creator", ProjectUtils.userIsCreator(project, loggedInUser));
put("user_is_backer", project.isBacking());
put("user_has_starred", project.isStarred());
}
}
};
return MapUtils.prefixKeys(properties, prefix);
}
public static @NonNull Map<String, Object> activityProperties(final @NonNull Activity activity) {
return activityProperties(activity, "activity_");
}
public static @NonNull Map<String, Object> activityProperties(final @NonNull Activity activity, final @NonNull String prefix) {
Map<String, Object> properties = new HashMap<String, Object>() {
{
put("category", activity.category());
}
};
properties = MapUtils.prefixKeys(properties, prefix);
final Project project = activity.project();
if (project != null) {
properties.putAll(projectProperties(project));
final Update update = activity.update();
if (update != null) {
properties.putAll(updateProperties(project, update));
}
}
return properties;
}
public static @NonNull Map<String, Object> updateProperties(final @NonNull Project project, final @NonNull Update update) {
return updateProperties(project, update, "update_");
}
public static @NonNull Map<String, Object> updateProperties(final @NonNull Project project, final @NonNull Update update, final @NonNull String prefix) {
Map<String, Object> properties = new HashMap<String, Object>() {
{
put("id", update.id());
put("title", update.title());
put("visible", update.visible());
put("comments_count", update.commentsCount());
// TODO: add `public` to `Update` model
// put("public")
// TODO: how to convert update.publishedAt() to seconds since 1970
// put("published_at", update.publishedAt())
}
};
properties = MapUtils.prefixKeys(properties, prefix);
properties.putAll(projectProperties(project));
return properties;
}
}