package nl.babbq.conference2015.fragments;

import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.Fragment;
import android.support.v4.util.Pair;
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 com.android.internal.util.Predicate;

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

import nl.babbq.conference2015.ConferenceActivity;
import nl.babbq.conference2015.MainActivity;
import nl.babbq.conference2015.R;
import nl.babbq.conference2015.adapters.HasAdapter;
import nl.babbq.conference2015.adapters.MainAdapter;
import nl.babbq.conference2015.objects.Conference;
import nl.babbq.conference2015.objects.ConferenceDay;
import nl.babbq.conference2015.utils.DividerItemDecoration;
import nl.babbq.conference2015.utils.ItemClickSupport;
import nl.babbq.conference2015.utils.Utils;

/**
 * Created by nono on 10/6/15.
 */
public class ListingFragment extends Fragment implements HasAdapter {

    private final static String DATA = "data";
    private final static String DAY = "day";

    private RecyclerView mRecyclerView;
    private List<Conference> mData = new ArrayList<>();
    private ConferenceDay mDay;
    private MainAdapter mAdapter;

    public static ListingFragment newInstance(ArrayList<Conference> conferences, final ConferenceDay day) {
        Bundle args = new Bundle();
        args.putParcelableArrayList(DATA, filterList(conferences, day));
        args.putSerializable(DAY, day);
        ListingFragment fragment = new ListingFragment();
        fragment.setArguments(args);
        return fragment;
    }


    public ListingFragment() {
    }

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        if (getArguments() != null) {
            mDay = (ConferenceDay) getArguments().getSerializable(DAY);
            mData.addAll(getArguments().<Conference>getParcelableArrayList(DATA));
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstaceState) {
        mRecyclerView = (RecyclerView)inflater
                .inflate(R.layout.fragment_listing, parent, false);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(),
                DividerItemDecoration.VERTICAL_LIST));
        ItemClickSupport.addTo(mRecyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
            @Override
            public void onItemClicked(RecyclerView recyclerView, int position, View v) {
                if (mData.get(position).getSpeaker().length() == 0) {
                    // if the speaker field is empty, it's probably a rre break or lunch
                    return;
                }

                // On Lollipop and above we animate the conference title
                // to the second activity
                Pair<View, String> headline = Pair.create(v.findViewById(R.id.headline),
                        getString(R.string.headline));
                Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(),
                        headline).toBundle();
                Intent intent = new Intent(getActivity(), ConferenceActivity.class);
                intent.putExtra("conference", (Parcelable)mData.get(position));
                ActivityCompat.startActivity(getActivity(), intent, bundle);
            }
        });

        if (mDay.isToday()) {
            int position = Conference.findNextEventPosition(mData);
            mRecyclerView.smoothScrollToPosition(position);
        }
        return mRecyclerView;
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mAdapter = new MainAdapter(getActivity(), mData);
        mRecyclerView.setAdapter(mAdapter);
    }

    @Override
    public void notifyDataSetChanged() {
        if (isAdded() && mAdapter != null) {
            if (getActivity() instanceof MainActivity) {
                ArrayList<Conference> newList = filterList(
                            ((MainActivity)getActivity()).getConferences(), mDay);
                if (newList != null) {
                    mData.clear();
                    mData.addAll(newList);
                }
            }
            mAdapter.notifyDataSetChanged();
        }
    }

    private static ArrayList<Conference> filterList(ArrayList<Conference> list, final ConferenceDay day) {
        Predicate<Conference> aDay = new Predicate<Conference>() {
            public boolean apply(Conference conference) {
                return conference.getStartDate().startsWith(day.getDay());
            }
        };
        return Utils.filter(list, aDay);
    }
}