package pasta.streamer.fragments;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;

import com.afollestad.async.Action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import kaaes.spotify.webapi.android.SpotifyService;
import kaaes.spotify.webapi.android.models.PlaylistSimple;
import kaaes.spotify.webapi.android.models.PlaylistsPager;
import pasta.streamer.Pasta;
import pasta.streamer.R;
import pasta.streamer.adapters.ListAdapter;
import pasta.streamer.data.CategoryListData;
import pasta.streamer.data.ListData;
import pasta.streamer.data.PlaylistListData;
import pasta.streamer.utils.PreferenceUtils;
import pasta.streamer.utils.StaticUtils;

public class CategoryFragment extends FullScreenFragment {

    @BindView(R.id.topTenTrackListView)
    RecyclerView recycler;
    @BindView(R.id.progressBar2)
    ProgressBar spinner;
    @BindView(R.id.toolbar)
    Toolbar toolbar;

    private Unbinder unbinder;

    ListAdapter adapter;
    GridLayoutManager manager;
    CategoryListData data;
    Action action;
    Map<String, Object> limitMap;
    Pasta pasta;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_category, container, false);
        unbinder = ButterKnife.bind(this, rootView);

        pasta = (Pasta) getContext().getApplicationContext();
        data = getArguments().getParcelable("category");
        limitMap = new HashMap<>();
        limitMap.put(SpotifyService.LIMIT, (PreferenceUtils.getLimit(getContext()) + 1) * 10);

        toolbar.setTitle(data.categoryName);
        toolbar.setNavigationIcon(R.drawable.ic_back);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getActivity().onBackPressed();
            }
        });

        int color = ContextCompat.getColor(getContext(), R.color.colorPrimary);
        setData(data.categoryName, color, color);

        spinner.setVisibility(View.VISIBLE);

        manager = new GridLayoutManager(getContext(), 1);

        recycler.setLayoutManager(manager);
        adapter = new ListAdapter(new ArrayList<ListData>());
        recycler.setAdapter(adapter);
        recycler.setHasFixedSize(true);

        action = new Action<ArrayList<PlaylistListData>>() {
            @NonNull
            @Override
            public String id() {
                return "getCategoryPlaylists";
            }

            @Nullable
            @Override
            protected ArrayList<PlaylistListData> run() throws InterruptedException {
                PlaylistsPager pager = null;
                for (int i = 0; pager == null && i < PreferenceUtils.getRetryCount(getContext()); i++) {
                    try {
                        pager = pasta.spotifyService.getPlaylistsForCategory(data.categoryId, limitMap);
                    } catch (Exception e) {
                        e.printStackTrace();
                        if (StaticUtils.shouldResendRequest(e)) Thread.sleep(200);
                        else break;
                    }
                }
                if (pager == null) return null;

                ArrayList<PlaylistListData> list = new ArrayList<>();
                for (PlaylistSimple playlist : pager.playlists.items) {
                    list.add(new PlaylistListData(playlist, pasta.me));
                }
                return list;
            }

            @Override
            protected void done(@Nullable ArrayList<PlaylistListData> result) {
                if (spinner != null) spinner.setVisibility(View.GONE);
                if (result == null) {
                    pasta.onCriticalError(getActivity(), "category playlists action");
                    return;
                }
                adapter.setList(result);
            }
        };
        action.execute();

        return rootView;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (action != null && action.isExecuting()) action.cancel();
        unbinder.unbind();
    }
}