package com.hapramp.ui.fragments;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.hapramp.R;
import com.hapramp.datastore.DataStore;
import com.hapramp.datastore.callbacks.CompetitionsListCallback;
import com.hapramp.models.CompetitionListResponse;
import com.hapramp.models.CompetitionModel;
import com.hapramp.preferences.HaprampPreferenceManager;
import com.hapramp.ui.adapters.CompetitionsListRecyclerAdapter;
import com.hapramp.utils.ViewItemDecoration;
import com.hapramp.views.competition.CompetitionFeedItemView;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;

public class MyCompetitionsFragment extends Fragment implements CompetitionsListCallback, CompetitionFeedItemView.CompetitionItemDeleteListener, CompetitionsListRecyclerAdapter.LoadMoreCompetitionsCallback {
  Context mContext;
  Unbinder unbinder;
  @BindView(R.id.competition_list)
  RecyclerView competitionList;
  @BindView(R.id.messagePanel)
  TextView messagePanel;
  @BindView(R.id.loading_progress_bar)
  ProgressBar loadingProgressBar;
  @BindView(R.id.swipe_refresh)
  SwipeRefreshLayout swipeRefresh;
  private DataStore dataStore;
  private CompetitionsListRecyclerAdapter competitionsListRecyclerAdapter;

  private String lastCompetitionId = "";
  private String lastLoadedOrLoadingId = "";

  @Override
  public void onAttach(Context context) {
    super.onAttach(context);
    this.mContext = context;
  }

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }

  @Nullable
  @Override
  public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.my_competitions_fragment, container, false);
    unbinder = ButterKnife.bind(this, view);
    initializeList();
    return view;
  }

  private void initializeList() {
    dataStore = new DataStore();
    Drawable drawable = ContextCompat.getDrawable(mContext, R.drawable.post_item_divider_view);
    ViewItemDecoration viewItemDecoration = new ViewItemDecoration(drawable);
    viewItemDecoration.setWantTopOffset(false, 0);
    competitionsListRecyclerAdapter = new CompetitionsListRecyclerAdapter(mContext);
    competitionsListRecyclerAdapter.setDeleteListener(this);
    competitionsListRecyclerAdapter.setLoadMoreCallback(this);
    competitionList.setLayoutManager(new LinearLayoutManager(mContext));
    competitionList.addItemDecoration(viewItemDecoration);
    competitionList.setAdapter(competitionsListRecyclerAdapter);
    swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
      @Override
      public void onRefresh() {
        refreshCompetitions();
      }
    });
  }

  private void refreshCompetitions() {
    dataStore.requestCompetitionLists(this);
  }

  @Override
  public void onResume() {
    super.onResume();
    fetchCompetitions();
  }

  @Override
  public void onDestroyView() {
    super.onDestroyView();
    unbinder.unbind();
  }

  private void fetchCompetitions() {
    setProgressVisibility(true);
    dataStore.requestCompetitionLists(this);
  }

  private void setProgressVisibility(boolean show) {
    if (loadingProgressBar != null) {
      if (show) {
        loadingProgressBar.setVisibility(View.VISIBLE);
      } else {
        loadingProgressBar.setVisibility(View.GONE);
      }
    }
  }

  @Override
  public void onCompetitionsListAvailable(CompetitionListResponse competitionsResponse, boolean isAppendable) {
    List<CompetitionModel> myContests = filterMyCompetitions(competitionsResponse.getCompetitionModels());
    try {
      lastCompetitionId = competitionsResponse.getLastId();
      if (isAppendable) {
        if (myContests != null) {
          if (myContests.size() > 0) {
            competitionsListRecyclerAdapter.appendCompetitions((ArrayList<CompetitionModel>) myContests);
          } else {
            competitionsListRecyclerAdapter.noMoreCompetitionsAvailableToLoad();
          }
        } else {
          competitionsListRecyclerAdapter.noMoreCompetitionsAvailableToLoad();
        }
      } else {
        if (swipeRefresh.isRefreshing()) {
          swipeRefresh.setRefreshing(false);
        }
        setProgressVisibility(false);
        if (myContests != null) {
          if (myContests.size() == 0) {
            setMessagePanel(true, "No competitions!");
          } else {
            setMessagePanel(false, "");
            competitionsListRecyclerAdapter.setCompetitions(myContests);
          }
        } else {
          setMessagePanel(true, "Something went wrong!");
        }
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  @Override
  public void onCompetitionsFetchError() {
    try {
      if (swipeRefresh.isRefreshing()) {
        swipeRefresh.setRefreshing(false);
      }
      setProgressVisibility(false);
      setMessagePanel(true, "Something went wrong!");
    }
    catch (Exception e) {

    }
  }

  private List<CompetitionModel> filterMyCompetitions(List<CompetitionModel> competitions) {
    String myUsername = HaprampPreferenceManager.getInstance().getCurrentSteemUsername();
    List<CompetitionModel> myCompetitions = new ArrayList<>();
    for (int i = 0; i < competitions.size(); i++) {
      if (competitions.get(i).getmAdmin().getmUsername().equals(myUsername)) {
        myCompetitions.add(competitions.get(i));
      }
    }
    return myCompetitions;
  }

  private void setMessagePanel(boolean show, String msg) {
    if (messagePanel != null) {
      if (show) {
        messagePanel.setText(msg);
        messagePanel.setVisibility(View.VISIBLE);
      } else {
        messagePanel.setVisibility(View.GONE);
      }
    }
  }

  @Override
  public void onCompetitionItemDeleted() {
    fetchCompetitions();
  }

  @Override
  public void loadMoreCompetitions() {
    fetchMoreCompetitions();
  }

  private void fetchMoreCompetitions() {
    if (lastLoadedOrLoadingId != lastCompetitionId) {
      dataStore.requestCompetitionLists(lastCompetitionId, this);
      lastLoadedOrLoadingId = lastCompetitionId;
    }
  }
}