/*
   Manual bookmarks database 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.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteOpenHelper;

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

import java.util.ArrayList;

public class ManualBookmarkGateway extends BookmarkBaseGateway
{

	public ManualBookmarkGateway(SQLiteOpenHelper bookmarkDB)
	{
		super(bookmarkDB);
	}

	@Override protected BookmarkBase createBookmark()
	{
		return new ManualBookmark();
	}

	@Override protected String getBookmarkTableName()
	{
		return BookmarkDB.DB_TABLE_BOOKMARK;
	}

	@Override
	protected void addBookmarkSpecificColumns(BookmarkBase bookmark, ContentValues columns)
	{
		ManualBookmark bm = (ManualBookmark)bookmark;
		columns.put(BookmarkDB.DB_KEY_BOOKMARK_HOSTNAME, bm.getHostname());
		columns.put(BookmarkDB.DB_KEY_BOOKMARK_PORT, bm.getPort());

		// gateway settings
		columns.put(BookmarkDB.DB_KEY_BOOKMARK_GW_ENABLE, bm.getEnableGatewaySettings());
		columns.put(BookmarkDB.DB_KEY_BOOKMARK_GW_HOSTNAME, bm.getGatewaySettings().getHostname());
		columns.put(BookmarkDB.DB_KEY_BOOKMARK_GW_PORT, bm.getGatewaySettings().getPort());
		columns.put(BookmarkDB.DB_KEY_BOOKMARK_GW_USERNAME, bm.getGatewaySettings().getUsername());
		columns.put(BookmarkDB.DB_KEY_BOOKMARK_GW_PASSWORD, bm.getGatewaySettings().getPassword());
		columns.put(BookmarkDB.DB_KEY_BOOKMARK_GW_DOMAIN, bm.getGatewaySettings().getDomain());
	}

	@Override protected void addBookmarkSpecificColumns(ArrayList<String> columns)
	{
		columns.add(BookmarkDB.DB_KEY_BOOKMARK_HOSTNAME);
		columns.add(BookmarkDB.DB_KEY_BOOKMARK_PORT);
		columns.add(BookmarkDB.DB_KEY_BOOKMARK_GW_ENABLE);
		columns.add(BookmarkDB.DB_KEY_BOOKMARK_GW_HOSTNAME);
		columns.add(BookmarkDB.DB_KEY_BOOKMARK_GW_PORT);
		columns.add(BookmarkDB.DB_KEY_BOOKMARK_GW_USERNAME);
		columns.add(BookmarkDB.DB_KEY_BOOKMARK_GW_PASSWORD);
		columns.add(BookmarkDB.DB_KEY_BOOKMARK_GW_DOMAIN);
	}

	@Override protected void readBookmarkSpecificColumns(BookmarkBase bookmark, Cursor cursor)
	{
		ManualBookmark bm = (ManualBookmark)bookmark;
		bm.setHostname(
		    cursor.getString(cursor.getColumnIndex(BookmarkDB.DB_KEY_BOOKMARK_HOSTNAME)));
		bm.setPort(cursor.getInt(cursor.getColumnIndex(BookmarkDB.DB_KEY_BOOKMARK_PORT)));

		bm.setEnableGatewaySettings(
		    cursor.getInt(cursor.getColumnIndex(BookmarkDB.DB_KEY_BOOKMARK_GW_ENABLE)) != 0);
		readGatewaySettings(bm, cursor);
	}

	public BookmarkBase findByLabelOrHostname(String pattern)
	{
		if (pattern.length() == 0)
			return null;

		Cursor cursor =
		    queryBookmarks(BookmarkDB.DB_KEY_BOOKMARK_LABEL + " = '" + pattern + "' OR " +
		                       BookmarkDB.DB_KEY_BOOKMARK_HOSTNAME + " = '" + pattern + "'",
		                   BookmarkDB.DB_KEY_BOOKMARK_LABEL);
		BookmarkBase bookmark = null;
		if (cursor.moveToFirst() && (cursor.getCount() > 0))
			bookmark = getBookmarkFromCursor(cursor);

		cursor.close();
		return bookmark;
	}

	public ArrayList<BookmarkBase> findByLabelOrHostnameLike(String pattern)
	{
		Cursor cursor =
		    queryBookmarks(BookmarkDB.DB_KEY_BOOKMARK_LABEL + " LIKE '%" + pattern + "%' OR " +
		                       BookmarkDB.DB_KEY_BOOKMARK_HOSTNAME + " LIKE '%" + pattern + "%'",
		                   BookmarkDB.DB_KEY_BOOKMARK_LABEL);
		ArrayList<BookmarkBase> bookmarks = new ArrayList<>(cursor.getCount());

		if (cursor.moveToFirst() && (cursor.getCount() > 0))
		{
			do
			{
				bookmarks.add(getBookmarkFromCursor(cursor));
			} while (cursor.moveToNext());
		}

		cursor.close();
		return bookmarks;
	}

	private void readGatewaySettings(ManualBookmark bookmark, Cursor cursor)
	{
		ManualBookmark.GatewaySettings gatewaySettings = bookmark.getGatewaySettings();
		gatewaySettings.setHostname(
		    cursor.getString(cursor.getColumnIndex(BookmarkDB.DB_KEY_BOOKMARK_GW_HOSTNAME)));
		gatewaySettings.setPort(
		    cursor.getInt(cursor.getColumnIndex(BookmarkDB.DB_KEY_BOOKMARK_GW_PORT)));
		gatewaySettings.setUsername(
		    cursor.getString(cursor.getColumnIndex(BookmarkDB.DB_KEY_BOOKMARK_GW_USERNAME)));
		gatewaySettings.setPassword(
		    cursor.getString(cursor.getColumnIndex(BookmarkDB.DB_KEY_BOOKMARK_GW_PASSWORD)));
		gatewaySettings.setDomain(
		    cursor.getString(cursor.getColumnIndex(BookmarkDB.DB_KEY_BOOKMARK_GW_DOMAIN)));
	}
}
