package com.fastaccess.ui.modules.repos.extras.assignees;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.view.View;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import com.fastaccess.R;
import com.fastaccess.data.dao.model.User;
import com.fastaccess.helper.BundleConstant;
import com.fastaccess.helper.Bundler;
import com.fastaccess.ui.adapter.AssigneesAdapter;
import com.fastaccess.ui.base.BaseDialogFragment;
import com.fastaccess.ui.widgets.FontTextView;
import com.fastaccess.ui.widgets.StateLayout;
import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import butterknife.BindView;
import butterknife.OnClick;
import icepick.State;
/**
* Created by Kosh on 22 Feb 2017, 7:23 PM
*/
public class AssigneesDialogFragment extends BaseDialogFragment<AssigneesMvp.View, AssigneesPresenter> implements AssigneesMvp.View {
@BindView(R.id.title) FontTextView title;
@BindView(R.id.recycler) DynamicRecyclerView recycler;
@BindView(R.id.stateLayout) StateLayout stateLayout;
@State HashMap<Integer, User> selectionMap;
private AssigneesAdapter adapter;
private AssigneesMvp.SelectedAssigneesListener callback;
public static AssigneesDialogFragment newInstance(@NonNull String login, @NonNull String repoId, boolean isAssignees) {
AssigneesDialogFragment fragment = new AssigneesDialogFragment();
fragment.setArguments(Bundler.start()
.put(BundleConstant.ID, repoId)
.put(BundleConstant.EXTRA, login)
.put(BundleConstant.EXTRA_TWO, isAssignees)
.end());
return fragment;
}
@Override public void onAttach(Context context) {
super.onAttach(context);
if (getParentFragment() instanceof AssigneesMvp.SelectedAssigneesListener) {
callback = (AssigneesMvp.SelectedAssigneesListener) getParentFragment();
} else if (context instanceof AssigneesMvp.SelectedAssigneesListener) {
callback = (AssigneesMvp.SelectedAssigneesListener) context;
} else {
throw new IllegalArgumentException("Parent Fragment or Activity must implement AssigneesMvp.SelectedAssigneesListener");
}
}
@Override public void onDetach() {
super.onDetach();
callback = null;
}
@Override protected int fragmentLayout() {
return R.layout.simple_footer_list_dialog;
}
@Override protected void onFragmentCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
if (savedInstanceState == null) {
if (getArguments() != null) {
//noinspection ConstantConditions
getPresenter().onCallApi(getArguments().getString(BundleConstant.EXTRA),
getArguments().getString(BundleConstant.ID),
getArguments().getBoolean(BundleConstant.EXTRA_TWO));
}
}
boolean isAssinees = getArguments().getBoolean(BundleConstant.EXTRA_TWO);
stateLayout.setEmptyText(isAssinees ? R.string.no_assignees : R.string.no_reviewers);
recycler.setEmptyView(stateLayout);
recycler.addKeyLineDivider();
title.setText(isAssinees ? R.string.assignees : R.string.reviewers);
adapter = new AssigneesAdapter(getPresenter().getList(), this);
recycler.setAdapter(adapter);
}
@NonNull @Override public AssigneesPresenter providePresenter() {
return new AssigneesPresenter();
}
@Override public boolean isAssigneeSelected(int position) {
return getSelectionMap().get(position) != null;
}
@Override public void onToggleSelection(int position, boolean select) {
if (select) {
getSelectionMap().put(position, adapter.getItem(position));
} else {
getSelectionMap().remove(position);
}
adapter.notifyDataSetChanged();
}
@OnClick({R.id.cancel, R.id.ok}) public void onClick(View view) {
switch (view.getId()) {
case R.id.cancel:
dismiss();
break;
case R.id.ok:
ArrayList<User> labels = Stream.of(selectionMap)
.filter(value -> value.getValue() != null)
.map(Map.Entry::getValue)
.collect(Collectors.toCollection(ArrayList::new));
if (labels != null && !labels.isEmpty()) {
callback.onSelectedAssignees(labels, getArguments().getBoolean(BundleConstant.EXTRA_TWO));
}
dismiss();
break;
}
}
@Override public void onNotifyAdapter(@Nullable List<User> items) {
hideProgress();
if (items == null || items.isEmpty()) {
adapter.clear();
return;
}
adapter.insertItems(items);
}
@Override public void showProgress(@StringRes int resId) {
stateLayout.showProgress();
}
@Override public void hideProgress() {
stateLayout.hideProgress();
}
@Override public void showErrorMessage(@NonNull String message) {
showReload();
super.showErrorMessage(message);
}
@Override public void showMessage(int titleRes, int msgRes) {
showReload();
super.showMessage(titleRes, msgRes);
}
private void showReload() {
hideProgress();
stateLayout.showReload(adapter.getItemCount());
}
public HashMap<Integer, User> getSelectionMap() {
if (selectionMap == null) {
selectionMap = new LinkedHashMap<>();
}
return selectionMap;
}
}