// 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.android.apps.reader;

import android.content.Context;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import io.v.android.apps.reader.db.DB;
import io.v.android.apps.reader.db.DB.DBList;
import io.v.android.apps.reader.model.Listener;
import io.v.android.apps.reader.vdl.DeviceSet;
import io.v.android.apps.reader.vdl.File;

/**
 * Adapter that binds the list of device sets to the corresponding card views.
 */
public class DeviceSetListAdapter extends RecyclerView.Adapter<DeviceSetListAdapter.ViewHolder>
        implements Listener {

    private OnDeviceSetClickListener mClickListener;
    private DB mDB;
    private DBList<File> mFiles;
    private DBList<DeviceSet> mDeviceSets;

    public class ViewHolder extends RecyclerView.ViewHolder {
        public CardView mCardView;
        public TextView mTextViewTitle;
        public TextView mTextViewId;

        public ViewHolder(CardView v) {
            super(v);
            mCardView = v;
            mTextViewTitle = (TextView) mCardView.findViewById(R.id.device_set_list_item_title);
            mTextViewId = (TextView) mCardView.findViewById(R.id.device_set_list_item_id);

            mCardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mClickListener != null) {
                        mClickListener.onDeviceSetClick(DeviceSetListAdapter.this, v, getPosition());
                    }
                }
            });
        }
    }

    public DeviceSetListAdapter(Context context) {
        mClickListener = null;

        mDB = DB.Singleton.get(context);
        mFiles = mDB.getFileList();
        mDeviceSets = mDB.getDeviceSetList();
        mDeviceSets.setListener(this);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // Create a new view here.
        CardView v = (CardView) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.device_set_list_item, parent, false);

        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        DeviceSet ds = mDeviceSets.getItem(position);

        holder.mTextViewTitle.setText("Title: " + getItemTitle(ds));
        holder.mTextViewId.setText("Id: " + ds.getId());
    }

    public String getItemTitle(int position) {
        return getItemTitle(mDeviceSets.getItem(position));
    }

    public String getItemTitle(DeviceSet ds) {
        File file = mFiles.getItemById(ds.getFileId());

        if (file != null) {
            return file.getTitle();
        } else {
            return "*** Error retrieving the title";
        }
    }

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

    public void setOnDeviceSetClickListener(OnDeviceSetClickListener clickListener) {
        mClickListener = clickListener;
    }

    public void stop() {
        mFiles.discard();
        mFiles = null;
        mDeviceSets.discard();
        mDeviceSets = null;
    }

    /**
     * Interface used for handling click events of the pdf files in the list.
     */
    public interface OnDeviceSetClickListener {
        void onDeviceSetClick(DeviceSetListAdapter adapter, View v, int position);
    }

}
