/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jmonkeyengine.tests;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;

public class CustomArrayAdapter extends ArrayAdapter<String> {
    private static final String TAG = "CustomArrayAdapter";

    /* List of items */
    private List<String> entries;
    private Context activity;

    /* Position of selected answer */
    private int selectedPosition = -1;
    /* Background Color of selected item */
    private int selectedBackgroundColor = 0xffff00;
    /* Background Color of non selected item */
    private int nonselectedBackgroundColor = 0x000000;
    /* Background Drawable Resource ID of selected item */
    private int selectedBackgroundResource = 0;
    /* Background Drawable Resource ID of non selected items */
    private int nonselectedBackgroundResource = 0;

    /* Variables to support list filtering */
    private ArrayList<String> filteredEntries;
    private Filter filter;

    public CustomArrayAdapter(Context context, int textViewResourceId, List<String> objects) {
        super(context, textViewResourceId, objects);
        activity = context;
        entries = new ArrayList<String>(objects);
        filteredEntries = new ArrayList<String>(objects);
        filter = new ClassNameFilter();
    }

    /** Setter for selected item position */
    public void setSelectedPosition(int selectedPosition) {
        this.selectedPosition = selectedPosition;
        Log.i(TAG, "Setting position to: " + this.selectedPosition);
    }

    /** Setter for selected item background color */
    public void setSelectedBackgroundColor(int selectedBackgroundColor) {
        this.selectedBackgroundColor = selectedBackgroundColor;
    }

    /** Setter for non selected background color */
    public void setNonSelectedBackgroundColor(int nonselectedBackgroundColor) {
        this.nonselectedBackgroundColor = nonselectedBackgroundColor;
    }

    /** Setter for selected item background resource id*/
    public void setSelectedBackgroundResource(int selectedBackgroundResource) {
        this.selectedBackgroundResource = selectedBackgroundResource;
    }

    /** Setter for non selected background resource id*/
    public void setNonSelectedBackgroundResource(int nonselectedBackgroundResource) {
        this.nonselectedBackgroundResource = nonselectedBackgroundResource;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Log.i(TAG, "getView for position: " + position + " with selectedItem: " + selectedPosition);

        View v = convertView;
        ViewHolder holder;
        if (v == null) {
            LayoutInflater vi =
                    (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.test_chooser_row, null);
            holder = new ViewHolder();
            holder.textView = (TextView) v.findViewById(R.id.txtClassName);
            holder.layoutRow = (LinearLayout) v.findViewById(R.id.layoutTestChooserRow);
            v.setTag(holder);
        } else {
            holder=(ViewHolder)v.getTag();
        }

        final String itemText = filteredEntries.get(position);
        if (itemText != null) {
            holder.textView.setText(itemText);
            if (position == selectedPosition) {
                Log.i(TAG, "setting Background Color to: " + selectedBackgroundColor);
//                holder.textView.setBackgroundColor(selectedBackgroundColor);
//                holder.textView.setBackgroundResource(selectedBackgroundResource);
                holder.layoutRow.setBackgroundResource(selectedBackgroundResource);
            } else {
                Log.i(TAG, "setting Background Color to: " + nonselectedBackgroundColor);
//                holder.textView.setBackgroundColor(nonselectedBackgroundColor);
//                holder.textView.setBackgroundResource(nonselectedBackgroundResource);
                holder.layoutRow.setBackgroundResource(nonselectedBackgroundResource);
            }
        }
        return v;

    }

    @Override
    public Filter getFilter(){
        if(filter == null){
            filter = new ClassNameFilter();
        }
        return filter;
    }

    public static class ViewHolder{
        public TextView textView;
        public LinearLayout layoutRow;
    }

    private class ClassNameFilter extends Filter{
        @Override
        protected FilterResults performFiltering(CharSequence constraint){
            FilterResults results = new FilterResults();
            String prefix = constraint.toString().toLowerCase();
            Log.i(TAG, "performFiltering: entries size: " + entries.size());
            if (prefix == null || prefix.length() == 0){
                ArrayList<String> list = new ArrayList<String>(entries);
                results.values = list;
                results.count = list.size();
                Log.i(TAG, "clearing filter with size: " + list.size());
            }else{
                final ArrayList<String> list = new ArrayList<String>(entries);
                final ArrayList<String> nlist = new ArrayList<String>();
                int count = list.size();

                for (int i = 0; i<count; i++){
                    if(list.get(i).toLowerCase().contains(prefix)){
                        nlist.add(list.get(i));
                    }
                    results.values = nlist;
                    results.count = nlist.size();
                }
                Log.i(TAG, "filtered list size: " + nlist.size() + ", entries size: " + entries.size());
            }
            Log.i(TAG, "Returning filter count: " + results.count);
            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            filteredEntries = (ArrayList<String>)results.values;
            notifyDataSetChanged();
            clear();
            int count = filteredEntries.size();
            for(int i = 0; i<count; i++){
                add(filteredEntries.get(i));
                notifyDataSetInvalidated();
            }
            Log.i(TAG, "publishing results with size: " + count);
        }
    }

}
