package me.ccrama.redditslide.Adapters;
import android.graphics.Color;
import android.os.AsyncTask;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.View;
import android.widget.TextView;
import com.fasterxml.jackson.databind.JsonNode;
import net.dean.jraw.http.RestResponse;
import net.dean.jraw.http.SubmissionRequest;
import net.dean.jraw.models.Comment;
import net.dean.jraw.models.CommentNode;
import net.dean.jraw.models.CommentSort;
import net.dean.jraw.models.Submission;
import net.dean.jraw.models.meta.SubmissionSerializer;
import net.dean.jraw.util.JrawUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import me.ccrama.redditslide.Authentication;
import me.ccrama.redditslide.Fragments.CommentPage;
import me.ccrama.redditslide.LastComments;
import me.ccrama.redditslide.util.NetworkUtil;
/**
* Created by ccrama on 9/17/2015.
*/
public class SubmissionComments {
public boolean single;
public final SwipeRefreshLayout refreshLayout;
private final String fullName;
private final CommentPage page;
public ArrayList<CommentObject> comments;
public Submission submission;
private String context;
private CommentSort defaultSorting = CommentSort.CONFIDENCE;
private CommentAdapter adapter;
public LoadData mLoadData;
public boolean online = true;
int contextNumber = 5;
public SubmissionComments(String fullName, CommentPage commentPage, SwipeRefreshLayout layout, Submission s) {
this.fullName = fullName;
this.page = commentPage;
online = NetworkUtil.isConnected(page.getActivity());
this.refreshLayout = layout;
if (s.getComments() != null) {
submission = s;
CommentNode baseComment = s.getComments();
comments = new ArrayList<>();
Map<Integer, MoreChildItem> waiting = new HashMap<>();
for (CommentNode n : baseComment.walkTree()) {
CommentObject obj = new CommentItem(n);
List<Integer> removed = new ArrayList<>();
Map<Integer, MoreChildItem> map = new TreeMap<>(Collections.reverseOrder());
map.putAll(waiting);
for (Integer i : map.keySet()) {
if (i >= n.getDepth()) {
comments.add(waiting.get(i));
removed.add(i);
waiting.remove(i);
}
}
comments.add(obj);
if (n.hasMoreComments() && online) {
waiting.put(n.getDepth(), new MoreChildItem(n, n.getMoreChildren()));
}
}
Map<Integer, MoreChildItem> map = new TreeMap<>(Collections.reverseOrder());
map.putAll(waiting);
for (Integer i : map.keySet()) {
comments.add(waiting.get(i));
waiting.remove(i);
}
if (baseComment.hasMoreComments() && online) {
comments.add(new MoreChildItem(baseComment, baseComment.getMoreChildren()));
}
if (adapter != null) {
adapter.notifyDataSetChanged();
}
refreshLayout.setRefreshing(false);
refreshLayout.setEnabled(false);
}
}
public SubmissionComments(String fullName, CommentPage commentPage, SwipeRefreshLayout layout) {
this.fullName = fullName;
this.page = commentPage;
this.refreshLayout = layout;
}
public SubmissionComments(String fullName, CommentPage commentPage, SwipeRefreshLayout layout, String context) {
this.fullName = fullName;
this.page = commentPage;
this.context = context;
this.refreshLayout = layout;
}
public SubmissionComments(String fullName, CommentPage commentPage, SwipeRefreshLayout layout, String context, int contextNumber) {
this.fullName = fullName;
this.page = commentPage;
this.context = context;
this.refreshLayout = layout;
this.contextNumber = contextNumber;
}
public void cancelLoad() {
if (mLoadData != null) {
mLoadData.cancel(true);
}
}
public void setSorting(CommentSort sort) {
defaultSorting = sort;
mLoadData = new LoadData(true);
mLoadData.execute(fullName);
}
public void loadMore(CommentAdapter adapter, String subreddit) {
this.adapter = adapter;
mLoadData = new LoadData(true);
mLoadData.execute(fullName);
}
public void loadMoreReply(CommentAdapter adapter) {
this.adapter = adapter;
adapter.currentSelectedItem = context;
mLoadData = new LoadData(false);
mLoadData.execute(fullName);
}
public void loadMoreReplyTop(CommentAdapter adapter, String context) {
this.adapter = adapter;
adapter.currentSelectedItem = context;
mLoadData = new LoadData(true);
mLoadData.execute(fullName);
if (context == null || context.isEmpty()) {
Snackbar s = Snackbar.make(page.rv, "Comment submitted", Snackbar.LENGTH_SHORT);
View view = s.getView();
TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(Color.WHITE);
s.show();
}
}
public void loadMore(CommentAdapter adapter, String subreddit, boolean forgetPlace) {
adapter.currentSelectedItem = "";
this.adapter = adapter;
mLoadData = new LoadData(true);
mLoadData.execute(fullName);
}
public JsonNode getSubmissionNode(SubmissionRequest request) {
Map<String, String> args = new HashMap<>();
if (request.getDepth() != null)
args.put("depth", Integer.toString(request.getDepth()));
if (request.getContext() != null)
args.put("context", Integer.toString(request.getContext()));
if (request.getLimit() != null)
args.put("limit", Integer.toString(request.getLimit()));
if (request.getFocus() != null && request.getFocus().length() >= 3 && !JrawUtils.isFullname(request.getFocus()))
args.put("comment", request.getFocus());
CommentSort sort = request.getSort();
if (sort == null)
// Reddit sorts by confidence by default
sort = CommentSort.CONFIDENCE;
args.put("sort", sort.name().toLowerCase());
RestResponse response = Authentication.reddit.execute(Authentication.reddit.request()
.path(String.format("/comments/%s", request.getId()))
.query(args)
.build());
return response.getJson();
}
public void reloadSubmission(CommentAdapter commentAdapter) {
commentAdapter.submission = Authentication.reddit.getSubmission(submission.getFullName().substring(3, submission.getFullName().length()));
}
public boolean forceSorting = false;
public class LoadData extends AsyncTask<String, Void, ArrayList<CommentObject>> {
final boolean reset;
public LoadData(boolean reset) {
this.reset = reset;
}
@Override
public void onPostExecute(ArrayList<CommentObject> subs) {
if (page.isVisible() && submission != null) {
refreshLayout.setRefreshing(false);
page.doRefresh(false);
if ((submission.isArchived() && !page.archived) || (submission.isLocked() && !page.locked) || (submission.getDataNode().get("contest_mode").asBoolean() && !page.contest))
page.doTopBarNotify(submission, adapter);
page.doData(reset);
LastComments.setComments(submission);
}
}
@Override
protected ArrayList<CommentObject> doInBackground(String... subredditPaginators) {
SubmissionRequest.Builder builder;
if (context == null) {
single = false;
builder = new SubmissionRequest.Builder(fullName).sort(defaultSorting);
} else {
single = true;
builder = new SubmissionRequest.Builder(fullName).sort(defaultSorting).focus(context).context(contextNumber);
}
try {
JsonNode node = getSubmissionNode(builder.build());
submission = SubmissionSerializer.withComments(node, defaultSorting);
CommentNode baseComment = submission.getComments();
/* if (page.o != null)
page.o.setCommentAndWrite(submission.getFullName(), node, submission).writeToMemory();*/
comments = new ArrayList<>();
Map<Integer, MoreChildItem> waiting = new HashMap<>();
for (CommentNode n : baseComment.walkTree()) {
CommentObject obj = new CommentItem(n);
List<Integer> removed = new ArrayList<>();
Map<Integer, MoreChildItem> map = new TreeMap<>(Collections.reverseOrder());
map.putAll(waiting);
for (Integer i : map.keySet()) {
if (i >= n.getDepth()) {
comments.add(waiting.get(i));
removed.add(i);
waiting.remove(i);
}
}
comments.add(obj);
if (n.hasMoreComments()) {
waiting.put(n.getDepth(), new MoreChildItem(n, n.getMoreChildren()));
}
}
Map<Integer, MoreChildItem> map = new TreeMap<>(Collections.reverseOrder());
map.putAll(waiting);
for (Integer i : map.keySet()) {
comments.add(waiting.get(i));
waiting.remove(i);
}
if (baseComment.hasMoreComments()) {
comments.add(new MoreChildItem(baseComment, baseComment.getMoreChildren()));
}
return comments;
} catch (Exception e) {
//Todo reauthenticate
}
return null;
}
}
}