package org.wordpress.android.ui.reader.adapters;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.CursorAdapter;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import org.wordpress.android.R;
import org.wordpress.android.datasets.ReaderSearchTable;

public class ReaderSearchSuggestionAdapter extends CursorAdapter {
    private static final int MAX_SUGGESTIONS = 5;
    private static final int CLEAR_ALL_ROW_ID = -1;

    private static final int NUM_VIEW_TYPES  = 2;
    private static final int VIEW_TYPE_QUERY = 0;
    private static final int VIEW_TYPE_CLEAR = 1;

    private String mCurrentFilter;
    private final Object[] mClearAllRow;
    private final int mClearAllBgColor;
    private final int mSuggestionBgColor;

    public ReaderSearchSuggestionAdapter(Context context) {
        super(context, null, false);
        String clearAllText = context.getString(R.string.label_clear_search_history);
        mClearAllRow = new Object[]{CLEAR_ALL_ROW_ID, clearAllText};
        mClearAllBgColor = ContextCompat.getColor(context, R.color.grey_lighten_30);
        mSuggestionBgColor = ContextCompat.getColor(context, R.color.filtered_list_suggestions);
    }

    public void setFilter(String filter) {
        // skip if unchanged
        if (isCurrentFilter(filter) && getCursor() != null) {
            return;
        }

        // get db cursor containing matching query strings
        Cursor sqlCursor = ReaderSearchTable.getQueryStringCursor(filter, MAX_SUGGESTIONS);

        // create a MatrixCursor which will be the actual cursor behind this adapter
        MatrixCursor matrixCursor = new MatrixCursor(
                new String[]{
                        ReaderSearchTable.COL_ID,
                        ReaderSearchTable.COL_QUERY});

        if (sqlCursor.moveToFirst()) {
            // first populate the matrix from the db cursor...
            do {
                long id = sqlCursor.getLong(sqlCursor.getColumnIndex(ReaderSearchTable.COL_ID));
                String query = sqlCursor.getString(sqlCursor.getColumnIndex(ReaderSearchTable.COL_QUERY));
                matrixCursor.addRow(new Object[]{id, query});
            } while (sqlCursor.moveToNext());

            // ...then add our custom item
            matrixCursor.addRow(mClearAllRow);
        }

        mCurrentFilter = filter;
        swapCursor(matrixCursor);
    }

    /*
     * forces setFilter() to always repopulate by skipping the isCurrentFilter() check
     */
    private void reload() {
        String newFilter = mCurrentFilter;
        mCurrentFilter = null;
        setFilter(newFilter);
    }

    private boolean isCurrentFilter(String filter) {
        if (TextUtils.isEmpty(filter) && TextUtils.isEmpty(mCurrentFilter)) {
            return true;
        }
        return filter != null && filter.equalsIgnoreCase(mCurrentFilter);
    }

    public String getSuggestion(int position) {
        Cursor cursor = (Cursor) getItem(position);
        if (cursor != null) {
            return cursor.getString(cursor.getColumnIndex(ReaderSearchTable.COL_QUERY));
        } else {
            return null;
        }
    }

    @Override
    public int getItemViewType(int position) {
        // use a different view type for the "clear" row so it doesn't get recycled and used
        // as a query row
        if (getItemId(position) == CLEAR_ALL_ROW_ID) {
            return VIEW_TYPE_CLEAR;
        }
        return VIEW_TYPE_QUERY;
    }

    @Override
    public int getViewTypeCount() {
        return NUM_VIEW_TYPES;
    }

    private class SuggestionViewHolder {
        private final TextView txtSuggestion;
        private final ImageView imgDelete;

        SuggestionViewHolder(View view) {
            txtSuggestion = (TextView) view.findViewById(R.id.text_suggestion);
            imgDelete = (ImageView) view.findViewById(R.id.image_delete);
        }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View view = LayoutInflater.from(context).inflate(R.layout.reader_listitem_suggestion, parent, false);

        SuggestionViewHolder holder = new SuggestionViewHolder(view);
        view.setTag(holder);

        long id = cursor.getLong(cursor.getColumnIndex(ReaderSearchTable.COL_ID));
        if (id == CLEAR_ALL_ROW_ID) {
            view.setBackgroundColor(mClearAllBgColor);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    confirmClearSavedSearches(v.getContext());
                }
            });
            holder.imgDelete.setVisibility(View.GONE);
        } else {
            view.setBackgroundColor(mSuggestionBgColor);
        }

        return view;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        SuggestionViewHolder holder = (SuggestionViewHolder) view.getTag();

        final String query = cursor.getString(cursor.getColumnIndex(ReaderSearchTable.COL_QUERY));
        holder.txtSuggestion.setText(query);

        long id = cursor.getLong(cursor.getColumnIndex(ReaderSearchTable.COL_ID));
        if (id != CLEAR_ALL_ROW_ID) {
            holder.imgDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ReaderSearchTable.deleteQueryString(query);
                    reload();
                }
            });
        }
    }

    private void confirmClearSavedSearches(Context context) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setMessage(R.string.dlg_confirm_clear_search_history)
               .setCancelable(true)
               .setNegativeButton(R.string.no, null)
               .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int id) {
                       clearSavedSearches();
                   }
               });
        AlertDialog alert = builder.create();
        alert.show();
    }

    private void clearSavedSearches() {
        ReaderSearchTable.deleteAllQueries();
        swapCursor(null);
    }
}
