/*
 * Copyright 2014 A.C.R. Development
 */
package acr.browser.lightning;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

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

public class HistoryDatabaseHandler extends SQLiteOpenHelper {

	// All Static variables
	// Database Version
	private static final int DATABASE_VERSION = 1;

	// Database Name
	public static final String DATABASE_NAME = "historyManager";

	// HistoryItems table name
	public static final String TABLE_HISTORY = "history";

	// HistoryItems Table Columns names
	public static final String KEY_ID = "id";

	public static final String KEY_URL = "url";

	public static final String KEY_TITLE = "title";

	public static SQLiteDatabase mDatabase;

	public HistoryDatabaseHandler(Context context) {
		super(context.getApplicationContext(), DATABASE_NAME, null, DATABASE_VERSION);
		mDatabase = this.getWritableDatabase();
	}

	// Creating Tables
	@Override
	public void onCreate(SQLiteDatabase db) {
		String CREATE_HISTORY_TABLE = "CREATE TABLE " + TABLE_HISTORY + "(" + KEY_ID
				+ " INTEGER PRIMARY KEY," + KEY_URL + " TEXT," + KEY_TITLE + " TEXT" + ")";
		db.execSQL(CREATE_HISTORY_TABLE);
	}

	// Upgrading database
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// Drop older table if existed
		db.execSQL("DROP TABLE IF EXISTS " + TABLE_HISTORY);

		// Create tables again
		onCreate(db);
	}

	public boolean isOpen() {
		if (mDatabase != null) {
			return mDatabase.isOpen();
		} else {
			return false;
		}
	}

	@Override
	public synchronized void close() {
		if (mDatabase != null) {
			mDatabase.close();
		}
		super.close();
	}

	/**
	 * All CRUD(Create, Read, Update, Delete) Operations
	 */

	public synchronized void delete(String url) {
		String n = getHistoryItem(url);
		if (n != null) {
			deleteHistoryItem(n);
		}
	}

	public synchronized void visitHistoryItem(String url, String title) {
		mDatabase.delete(TABLE_HISTORY, KEY_URL + " = ?", new String[] { url });
		ContentValues values = new ContentValues();
		values.put(KEY_URL, url);
		values.put(KEY_TITLE, title);
		mDatabase.insert(TABLE_HISTORY, null, values);
	}

	// Adding new item
	public synchronized void addHistoryItem(HistoryItem item) {
		ContentValues values = new ContentValues();
		values.put(KEY_URL, item.getUrl());
		values.put(KEY_TITLE, item.getTitle());
		mDatabase.insert(TABLE_HISTORY, null, values);
	}

	// Getting single item
	String getHistoryItem(String url) {
		Cursor cursor = mDatabase.query(TABLE_HISTORY, new String[] { KEY_ID, KEY_URL, KEY_TITLE },
				KEY_URL + "=?", new String[] { url }, null, null, null, null);
		String m = null;
		if (cursor != null) {
			cursor.moveToFirst();
			m = cursor.getString(0);

			cursor.close();
		}
		// return item
		return m;
	}

	public List<HistoryItem> findItemsContaining(String search) {
		List<HistoryItem> itemList = new ArrayList<HistoryItem>();
		// select query
		String selectQuery = "SELECT * FROM " + TABLE_HISTORY + " WHERE " + KEY_TITLE + " LIKE '%"
				+ search + "%' OR " + KEY_URL + " LIKE '%" + search + "%'";
		Cursor cursor = mDatabase.rawQuery(selectQuery, null);

		// looping through all rows and adding to list
		int n = 0;
		if (cursor.moveToLast()) {
			do {
				HistoryItem item = new HistoryItem();
				item.setID(Integer.parseInt(cursor.getString(0)));
				item.setUrl(cursor.getString(1));
				item.setTitle(cursor.getString(2));
				item.setImageId(R.drawable.ic_history);
				// Adding item to list
				itemList.add(item);
				n++;
			} while (cursor.moveToPrevious() && n < 5);
		}
		cursor.close();
		// return item list
		return itemList;
	}

	public List<HistoryItem> getLastHundredItems() {
		List<HistoryItem> itemList = new ArrayList<HistoryItem>();
		String selectQuery = "SELECT  * FROM " + TABLE_HISTORY;

		Cursor cursor = mDatabase.rawQuery(selectQuery, null);
		int counter = 0;
		if (cursor.moveToLast()) {
			do {
				HistoryItem item = new HistoryItem();
				item.setID(Integer.parseInt(cursor.getString(0)));
				item.setUrl(cursor.getString(1));
				item.setTitle(cursor.getString(2));
				item.setImageId(R.drawable.ic_history);
				itemList.add(item);
				counter++;
			} while (cursor.moveToPrevious() && counter < 100);
		}
		cursor.close();
		return itemList;
	}

	public List<HistoryItem> getAllHistoryItems() {
		List<HistoryItem> itemList = new ArrayList<HistoryItem>();
		String selectQuery = "SELECT  * FROM " + TABLE_HISTORY;

		Cursor cursor = mDatabase.rawQuery(selectQuery, null);

		if (cursor.moveToFirst()) {
			do {
				HistoryItem item = new HistoryItem();
				item.setID(Integer.parseInt(cursor.getString(0)));
				item.setUrl(cursor.getString(1));
				item.setTitle(cursor.getString(2));
				item.setImageId(R.drawable.ic_history);
				itemList.add(item);
			} while (cursor.moveToNext());
		}
		cursor.close();
		return itemList;
	}

	// Updating single item
	public synchronized int updateHistoryItem(HistoryItem item) {

		ContentValues values = new ContentValues();
		values.put(KEY_URL, item.getUrl());
		values.put(KEY_TITLE, item.getTitle());
		int n = mDatabase.update(TABLE_HISTORY, values, KEY_ID + " = ?",
				new String[] { String.valueOf(item.getId()) });
		// updating row
		return n;
	}

	// Deleting single item
	public synchronized void deleteHistoryItem(String id) {
		mDatabase.delete(TABLE_HISTORY, KEY_ID + " = ?", new String[] { String.valueOf(id) });
	}

	// Getting items Count
	public int getHistoryItemsCount() {
		String countQuery = "SELECT  * FROM " + TABLE_HISTORY;
		Cursor cursor = mDatabase.rawQuery(countQuery, null);
		cursor.close();

		// return count
		return cursor.getCount();
	}
}

@@ -1899,104 +1899,108 @@
 lete
-(String url) %7B%0A%09%09String n = getHistoryItem(url);%0A%09%09if (n != null) %7B%0A%09%09%09deleteHistoryItem(n);%0A%09%09%7D
+HistoryItem(String url) %7B%0A%09%09mDatabase.delete(TABLE_HISTORY, KEY_URL + %22 = ?%22, new String%5B%5D %7B url %7D);
 %0A%09%7D%0A
@@ -5389,183 +5389,8 @@
 %09%7D%0A%0A
-%09// Deleting single item%0A%09public synchronized void deleteHistoryItem(String id) %7B%0A%09%09mDatabase.delete(TABLE_HISTORY, KEY_ID + %22 = ?%22, new String%5B%5D %7B String.valueOf(id) %7D);%0A%09%7D%0A%0A
 %09// 

Make history deletion more efficient