#include "burner.h"
#include "version.h"
#include "build_details.h"
#include <richedit.h>

// Print text surrounded by a black outline
static void myDrawText(HDC hDC, RECT* pRect, TCHAR* szText, int nSizeDelta, int nColour, UINT uFormat)
{
	TCHAR szName[32];
	RECT rect;
	HFONT hFont, myFont;
	TEXTMETRIC myMetric;
	
	GetTextFace(hDC, 32, szName);
	GetTextMetrics(hDC, &myMetric);
	myFont = CreateFont(myMetric.tmHeight + nSizeDelta, 0, 0, 0, FW_BLACK, 0, 0, 0, 0, 0, 0, ANTIALIASED_QUALITY, 0, szName);
	hFont = (HFONT)SelectObject(hDC, myFont);
	SetBkMode(hDC, TRANSPARENT);

	// Shrink the rect to allow space for the outline
	memcpy(&rect, pRect, sizeof(RECT));
	rect.left += 1;
	rect.top += 1;
	rect.right -= 1;
	rect.bottom -= 1;

	// Print the outline first
	SetTextColor(hDC, 0);
	rect.left -= 1;
	rect.right -= 1;
	DrawText(hDC, szText, -1, &rect, uFormat);
	rect.top -= 1;
	rect.bottom -= 1;
	DrawText(hDC, szText, -1, &rect, uFormat);
	rect.left += 1;
	rect.right += 1;
	DrawText(hDC, szText, -1, &rect, uFormat);
	rect.left += 1;
	rect.right += 1;
	DrawText(hDC, szText, -1, &rect, uFormat);
	rect.top += 1;
	rect.bottom += 1;
	DrawText(hDC, szText, -1, &rect, uFormat);
	rect.top += 1;
	rect.bottom += 1;
	DrawText(hDC, szText, -1, &rect, uFormat);
	rect.left -= 1;
	rect.right -= 1;
	DrawText(hDC, szText, -1, &rect, uFormat);
	rect.left -= 1;
	rect.right -= 1;
	DrawText(hDC, szText, -1, &rect, uFormat);
	rect.left += 1;
	rect.right += 1;
	rect.top -= 1;
	rect.bottom -= 1;

	// Then print the text on top
	SetTextColor(hDC, nColour);
	DrawText(hDC, szText, -1, &rect, uFormat);

	SelectObject(hDC, hFont);
	DeleteObject(myFont);
}

static bool AboutDrawStrings(unsigned int nControlID, LPDRAWITEMSTRUCT pdis)
{
	switch (nControlID) {
		case IDC_FBA_VER: {
			TCHAR szVerString[128];
			if ((nBurnVer & 0xFFFF) > 0x9990) {

				int nVer1 = ((nBurnVer >> 16) & 0xFF) + 1;
				if ((nVer1 & 0x0F) > 9) {
					nVer1 += 6;
				}
				int nVer2 = nVer1 & 0x0F;
				nVer1 >>= 4;

				_stprintf(szVerString, _T(APP_TITLE) _T(" v%s (v%i.%i Release Candidate %i)"), szAppBurnVer, nVer1, nVer2, nBurnVer & 0x0F);
			} else {
				if (nBurnVer & 0x00FF) {
					_stprintf(szVerString, _T(APP_TITLE) _T(" v%s (alpha version)"), szAppBurnVer);
				} else {
					if (nBurnVer & 0xFF00) {
						_stprintf(szVerString, _T(APP_TITLE) _T(" v%s (beta version)"), szAppBurnVer);
					} else {
						_stprintf(szVerString, _T(APP_TITLE) _T(" v%s (release version)"), szAppBurnVer);
					}
				}
			}

			myDrawText(pdis->hDC, &pdis->rcItem, szVerString, 2, RGB(0xFF, 0xF7, 0xDF), DT_CENTER);

			return true;
		}
		case IDC_SPECIALSTRING: {

#ifdef SPECIALBUILD
			TCHAR* szSpecialBuild = _T(MAKE_STRING(SPECIALBUILD));

			myDrawText(pdis->hDC, &pdis->rcItem, szSpecialBuild, -1, RGB(0xFF, 0xCF, 0x7F), DT_CENTER);
#else
			TCHAR szBuild[256] = _T("");

			RECT rect = pdis->rcItem;
			rect.top += 1;
#ifdef MMX
			_stprintf(szBuild, _T("built on ") _T(MAKE_STRING(BUILD_DATE)) _T(", ") _T(MAKE_STRING(BUILD_TIME)) _T(" (") _T(MAKE_STRING(BUILD_CHAR)) _T(", ") _T(MAKE_STRING(BUILD_COMP)) _T(", ") _T(MAKE_STRING(BUILD_CPU)) _T("%s)"), MMX ? _T(", MMX") : _T(""));
#else
			_stprintf(szBuild, _T("built on ") _T(MAKE_STRING(BUILD_DATE)) _T(", ") _T(MAKE_STRING(BUILD_TIME)) _T(" (") _T(MAKE_STRING(BUILD_CHAR)) _T(", ") _T(MAKE_STRING(BUILD_COMP)) _T(", ") _T(MAKE_STRING(BUILD_CPU)) _T("%s)"), _T(""));
#endif 

			myDrawText(pdis->hDC, &rect, szBuild, -2, RGB(0xDB, 0xDB, 0xDB), DT_CENTER);
#endif
			return true;
		}
	}

	return false;
}

// ----------------------------------------------------------------------------

void AddLicenseText(HWND hDlg, unsigned int nControlID)
{
	HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(ID_LICENSE), MAKEINTRESOURCE(256));
	HGLOBAL hglobal = LoadResource(NULL, hrsrc);
	char* pszLicense = (char*)LockResource(hglobal);

	SendDlgItemMessageA(hDlg, nControlID, WM_SETTEXT, (WPARAM)0, (LPARAM)pszLicense);
}

// ----------------------------------------------------------------------------

static INT_PTR CALLBACK AboutProc(HWND hDlg ,UINT Msg, WPARAM wParam, LPARAM lParam)
{
	if (Msg == WM_INITDIALOG) {
		WndInMid(hDlg, hScrnWnd);
		return TRUE;
	}

	if (Msg == WM_DRAWITEM) {
		if (AboutDrawStrings(wParam, (LPDRAWITEMSTRUCT)lParam)) {
			return TRUE;
		}

		return 0;
	}

	if (Msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_SHOWLICENSE) {
		RECT rect = { 0, 0, 0, 80 };

		SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg, IDOK), TRUE);
		EnableWindow(GetDlgItem(hDlg, IDC_SHOWLICENSE), FALSE);

		SendDlgItemMessage(hDlg, IDC_LICENSE, EM_SETMARGINS, EC_LEFTMARGIN, 3);
//		SendDlgItemMessage(hDlg, IDC_LICENSE, EM_SETTYPOGRAPHYOPTIONS, TO_ADVANCEDTYPOGRAPHY, TO_ADVANCEDTYPOGRAPHY);

		AddLicenseText(hDlg, IDC_LICENSE);

		MapDialogRect(hDlg, &rect);
		int nSize = rect.bottom;
		GetWindowRect(hDlg, &rect);
		MoveWindow(hDlg, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top + nSize, TRUE);

		WndInMid(hDlg, hScrnWnd);
		return 0;
	}

	if (Msg == WM_CLOSE) {
		EndDialog(hDlg,0);
	}
	if (Msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK) {
		SendMessage(hDlg, WM_CLOSE, 0, 0);
	}

	return 0;
}

int AboutCreate()
{
	HMODULE hRiched = NULL;
	
#if defined (_UNICODE)
	hRiched = LoadLibrary(L"RICHED20.DLL");
#else
	hRiched = LoadLibrary("RICHED20.DLL");
#endif
	if (hRiched) {	
		FBADialogBox(hAppInst, MAKEINTRESOURCE(IDD_ABOUT), hScrnWnd, (DLGPROC)AboutProc);
		FreeLibrary(hRiched);
		hRiched = NULL;
	}

	return 0;
}

// ----------------------------------------------------------------------------

static INT_PTR CALLBACK FirstProc(HWND hDlg ,UINT Msg, WPARAM wParam, LPARAM lParam)
{
	static bool bLicenseDisplayed, bLicenseAccepted;

	if (Msg == WM_INITDIALOG) {
		TCHAR szWarningString[4096];

		bLicenseDisplayed = false;
		bLicenseAccepted = false;

		SendDlgItemMessage(hDlg, IDC_LICENSE, EM_SETMARGINS, EC_LEFTMARGIN, 3);
//		SendDlgItemMessage(hDlg, IDC_LICENSE, EM_SETTYPOGRAPHYOPTIONS, TO_ADVANCEDTYPOGRAPHY, TO_ADVANCEDTYPOGRAPHY);

		_stprintf(szWarningString, FBALoadStringEx(hAppInst, IDS_FIRSTRUN1, true), _T(APP_TITLE), szAppBurnVer);
		_tcscat(szWarningString, FBALoadStringEx(hAppInst, IDS_FIRSTRUN2, true));
#if VER_ALPHA > 0 && (VER_ALPHA < 90 || VER_BETA < 99)
		_tcscat(szWarningString, FBALoadStringEx(hAppInst, IDS_FIRSTRUN3A, true));
#elif VER_BETA > 0 && VER_BETA < 99
		_tcscat(szWarningString, FBALoadStringEx(hAppInst, IDS_FIRSTRUN3B, true));
#endif

		SendDlgItemMessage(hDlg, IDC_LICENSE, WM_SETTEXT, (WPARAM)0, (LPARAM)szWarningString);

		ShowWindow(GetDlgItem(hDlg, IDC_ACCEPTLICENSE), SW_HIDE);

		SetForegroundWindow(hDlg);
		WndInMid(hDlg, NULL);
		
		SplashDestroy(1);

		return TRUE;
	}

	if (Msg == WM_DRAWITEM) {
		if (AboutDrawStrings(wParam, (LPDRAWITEMSTRUCT)lParam)) {
			return TRUE;
		}

		return 0;
	}

	if (Msg == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK) {

		if (bLicenseDisplayed) {
			if (bLicenseAccepted) {
				SendMessage(hDlg, WM_CLOSE, 0, 0);
			}
			return 0;
		}

		bLicenseDisplayed = true;

		EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
		ShowWindow(GetDlgItem(hDlg, IDC_ACCEPTLICENSE), SW_SHOW);
		SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg, IDC_ACCEPTLICENSE), TRUE);

		AddLicenseText(hDlg, IDC_LICENSE);

		return 0;
	}
	if (Msg == WM_COMMAND && LOWORD(wParam) == IDC_ACCEPTLICENSE) {
		if (SendDlgItemMessage(hDlg, IDC_ACCEPTLICENSE, BM_GETSTATE, 0, 0) & BST_CHECKED) {
			bLicenseAccepted = true;
			EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
		} else {
			bLicenseAccepted = false;
			EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
		}
	}

	if (Msg == WM_CLOSE) {
		if (bLicenseAccepted) {
			EndDialog(hDlg, 0);
		}
	}

	return 0;
}

int FirstUsageCreate()
{
	HMODULE hRiched = NULL;
	
#if defined (_UNICODE)
	hRiched = LoadLibrary(L"RICHED20.DLL");
#else
	hRiched = LoadLibrary("RICHED20.DLL");
#endif
	if (hRiched) {	
		DialogBox(hAppInst, MAKEINTRESOURCE(IDD_FIRST), hScrnWnd, (DLGPROC)FirstProc);
		FreeLibrary(hRiched);
		hRiched = NULL;
	}

	return 0;
}

