/*
   Quick connect history gateway

   Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz

   This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
   If a copy of the MPL was not distributed with this file, You can obtain one at
   http://mozilla.org/MPL/2.0/.
*/

package com.freerdp.freerdpcore.services;

import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import com.freerdp.freerdpcore.domain.BookmarkBase;
import com.freerdp.freerdpcore.domain.QuickConnectBookmark;

import java.util.ArrayList;

public class QuickConnectHistoryGateway
{
	private final static String TAG = "QuickConnectHistoryGateway";
	private final SQLiteOpenHelper historyDB;

	public QuickConnectHistoryGateway(SQLiteOpenHelper historyDB)
	{
		this.historyDB = historyDB;
	}

	public ArrayList<BookmarkBase> findHistory(String filter)
	{
		String[] column = { HistoryDB.QUICK_CONNECT_TABLE_COL_ITEM };

		SQLiteDatabase db = getReadableDatabase();
		String selection =
		    (filter.length() > 0)
		        ? (HistoryDB.QUICK_CONNECT_TABLE_COL_ITEM + " LIKE '%" + filter + "%'")
		        : null;
		Cursor cursor = db.query(HistoryDB.QUICK_CONNECT_TABLE_NAME, column, selection, null, null,
		                         null, HistoryDB.QUICK_CONNECT_TABLE_COL_TIMESTAMP);

		ArrayList<BookmarkBase> result = new ArrayList<>(cursor.getCount());
		if (cursor.moveToFirst())
		{
			do
			{
				String hostname =
				    cursor.getString(cursor.getColumnIndex(HistoryDB.QUICK_CONNECT_TABLE_COL_ITEM));
				QuickConnectBookmark bookmark = new QuickConnectBookmark();
				bookmark.setLabel(hostname);
				bookmark.setHostname(hostname);
				result.add(bookmark);
			} while (cursor.moveToNext());
		}
		cursor.close();
		return result;
	}

	public void addHistoryItem(String item)
	{
		String insertHistoryItem = "INSERT OR REPLACE INTO " + HistoryDB.QUICK_CONNECT_TABLE_NAME +
		                           " (" + HistoryDB.QUICK_CONNECT_TABLE_COL_ITEM + ", " +
		                           HistoryDB.QUICK_CONNECT_TABLE_COL_TIMESTAMP + ") VALUES('" +
		                           item + "', datetime('now'))";
		SQLiteDatabase db = getWritableDatabase();
		try
		{
			db.execSQL(insertHistoryItem);
		}
		catch (SQLException e)
		{
			Log.v(TAG, e.toString());
		}
	}

	public boolean historyItemExists(String item)
	{
		String[] column = { HistoryDB.QUICK_CONNECT_TABLE_COL_ITEM };
		SQLiteDatabase db = getReadableDatabase();
		Cursor cursor = db.query(HistoryDB.QUICK_CONNECT_TABLE_NAME, column,
		                         HistoryDB.QUICK_CONNECT_TABLE_COL_ITEM + " = '" + item + "'", null,
		                         null, null, null);
		boolean exists = (cursor.getCount() == 1);
		cursor.close();
		return exists;
	}

	public void removeHistoryItem(String hostname)
	{
		SQLiteDatabase db = getWritableDatabase();
		db.delete(HistoryDB.QUICK_CONNECT_TABLE_NAME,
		          HistoryDB.QUICK_CONNECT_TABLE_COL_ITEM + " = '" + hostname + "'", null);
	}

	// safety wrappers
	// in case of getReadableDatabase it could happen that upgradeDB gets called which is
	// a problem if the DB is only readable
	private SQLiteDatabase getWritableDatabase()
	{
		return historyDB.getWritableDatabase();
	}

	private SQLiteDatabase getReadableDatabase()
	{
		SQLiteDatabase db;
		try
		{
			db = historyDB.getReadableDatabase();
		}
		catch (SQLiteException e)
		{
			db = historyDB.getWritableDatabase();
		}
		return db;
	}
}
