// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.syncslides;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import io.v.syncslides.db.DB;
import io.v.syncslides.model.DynamicList;
import io.v.syncslides.model.ListListener;
import io.v.syncslides.model.Session;
import io.v.syncslides.model.Slide;

/**
 * Provides a list of slides to be shown in the RecyclerView of the SlideListFragment.
 */
public class SlideListAdapter extends RecyclerView.Adapter<SlideListAdapter.ViewHolder>
        implements ListListener {

    private final RecyclerView mRecyclerView;
    private DynamicList<Slide> mSlides;

    public SlideListAdapter(RecyclerView recyclerView, DB db, DynamicList<Slide> slides) {
        mRecyclerView = recyclerView;
        mSlides = slides;
        mSlides.addListener(this);
    }

    @Override
    public SlideListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.slide_card, parent, false);
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = mRecyclerView.getChildAdapterPosition(v);
                ((PresentationActivity) v.getContext()).navigateToSlide(position);
            }
        });
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(SlideListAdapter.ViewHolder holder, int position) {
        Slide slide = mSlides.get(position);
        holder.mNotes.setText(slide.getNotes());
        holder.mImage.setImageBitmap(slide.getThumb());
    }

    @Override
    public int getItemCount() {
        return mSlides.getItemCount();
    }

    @Override
    public void onError(Exception e) {
        // TODO(kash): Not sure what to do here...  Call start()/stop() to reset
        // the DynamicList?
    }

    /**
     * Stops any background monitoring of the underlying data.
     */
    public void stop() {
        mSlides.removeListener(this);
        mSlides = null;
    }


    public static class ViewHolder extends RecyclerView.ViewHolder {
        public final ImageView mImage;
        public final TextView mNotes;

        public ViewHolder(View itemView) {
            super(itemView);
            mImage = (ImageView) itemView.findViewById(R.id.slide_card_image);
            mNotes = (TextView) itemView.findViewById(R.id.slide_card_notes);
        }
    }

}
