/*
IEView history viewer plugin for Miranda IM

Copyright © 2005-2006 Cristian Libotean

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#include "stdafx.h"

#ifdef _DEBUG
int LogInit()
{
	FILE *fout = fopen("IEHistory.log", "wt");
	fclose(fout);
	return 0;
}
int Log(char *format, ...)
{
	char		str[4096];
	va_list	vararg;
	int tBytes;
	FILE *fout = fopen("IEHistory.log", "at");
	if (!fout) {
		//			MessageBox(0, "can't open file", NULL, MB_OK);
	}

	va_start(vararg, format);

	tBytes = _vsnprintf_s(str, sizeof(str), format, vararg);
	if (tBytes > 0) {
		str[tBytes] = 0;
	}

	va_end(vararg);
	if (str[mir_strlen(str) - 1] != '\n') {
		mir_strcat(str, "\n");
	}
	fputs(str, fout);
	fclose(fout);
	return 0;
}
#endif



int Info(char *title, char *format, ...)
{
	char str[4096];
	va_list vararg;
	int tBytes;
	va_start(vararg, format);
	tBytes = _snprintf_s(str, sizeof(str), format, vararg);
	if (tBytes > 0) {
		str[tBytes] = 0;
	}
	va_end(vararg);
	return MessageBoxA(nullptr, str, title, MB_OK | MB_ICONINFORMATION);
}

/*
Moves a control with regard to certain anchors (like delphi, c#, ...)
Somebody please improve on this code ...
*/

void ScreenToClient(HWND hWnd, LPRECT rect)
{
	POINT pt;
	int cx = rect->right - rect->left;
	int cy = rect->bottom - rect->top;
	pt.x = rect->left;
	pt.y = rect->top;
	ScreenToClient(hWnd, &pt);
	rect->left = pt.x;
	rect->top = pt.y;
	rect->right = pt.x + cx;
	rect->bottom = pt.y + cy;
}

void UnixTimeToFileTime(time_t t, LPFILETIME pft)
{
	// Note that LONGLONG is a 64-bit value
	LONGLONG ll;

	ll = Int32x32To64(t, 10000000) + 116444736000000000;
	pft->dwLowDateTime = (uint32_t)ll;
	pft->dwHighDateTime = ll >> 32;
}

void UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst)
{
	FILETIME ft;
	SYSTEMTIME st;
	UnixTimeToFileTime(t, &ft);
	FileTimeToSystemTime(&ft, &st);
	SystemTimeToTzSpecificLocalTime(nullptr, &st, pst);
}

MEVENT GetNeededEvent(MCONTACT contact, MEVENT hEvent, int num, int direction)
{
	for (int i = 0; i < num; ++i)
		hEvent = (direction == DIRECTION_BACK) ? db_event_prev(contact, hEvent) : db_event_next(contact, hEvent);

	return hEvent;
}

SearchResult SearchHistory(MCONTACT contact, MEVENT hFirstEvent, void *searchData, int direction, int type)
{
	if (hFirstEvent == NULL)
		hFirstEvent = (direction == DIRECTION_BACK) ? db_event_last(contact) : db_event_first(contact);

	int index = 0;
	MEVENT hEvent = hFirstEvent;
	void *buffer = nullptr;
	bool found = false;
	int oldSize, newSize;
	oldSize = newSize = 0;

	DBEVENTINFO dbEvent = {};
	while ((!found) && (hEvent)) {
		newSize = db_event_getBlobSize(hEvent);
		if (newSize > oldSize) {
			buffer = (wchar_t *)realloc(buffer, newSize);
			oldSize = newSize;
		}
		dbEvent.pBlob = (uint8_t*)buffer;
		dbEvent.cbBlob = newSize;
		if (db_event_get(hEvent, &dbEvent) == 0) { //successful
			switch (type) {
			case SEARCH_TEXT:
				{
					ptrW data(DbEvent_GetTextW(&dbEvent, CP_UTF8));
					wchar_t *tmp = wcsstr(data, (wchar_t *)searchData);
					if (tmp)
						found = true;
				}
				break;
			
			case SEARCH_TIME:
				{
					SYSTEMTIME time;
					TimeSearchData *data = (TimeSearchData *)searchData;
					UnixTimeToSystemTime((time_t)dbEvent.timestamp, &time);
					found = ((data->flags & TSDF_DATE_SET) || (data->flags & TSDF_TIME_SET)) ? true : false;
					if (data->flags & TSDF_DATE_SET)
						found = ((time.wYear == data->time.wYear) && (time.wMonth == data->time.wMonth) && (time.wDay == data->time.wDay));

					if (data->flags & TSDF_TIME_SET)
						found = found & ((time.wHour == data->time.wHour) && (time.wMinute == data->time.wMinute));
					break;
				}
			}
		}
		if (!found) {
			hEvent = GetNeededEvent(contact, hEvent, 1, direction);
			index++;
		}
	}
	free(buffer);
	SearchResult sr;
	sr.index = index;
	sr.hEvent = hEvent;
	return sr;
}