#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <stdio.h>
//sound
#pragma comment(lib,"winmm")
//image
#define BMPFILE TEXT("bin/Misaka.bmp")
#define APP_NAME TEXT("御坂妹")
#define BUFFER_SIZE 256
#include <time.h>
//Menu
#define IDM_WIND 40001
#define IDM_SET 40002
#define IDM_HOGE 40003
#define IDM_END 40004
//ini
#define INI_FILE TEXT("./test.ini")
#define INT_SECNAME TEXT("Test")
#define INI_VALUENAME TEXT("WINTOP")
#define INT_SECNAME2 TEXT("POSITION")
#define INI_WINDOWLEFT TEXT("WINDOWLEFT")
#define INT_SECNAME3 TEXT("POSITION2")
#define INI_WINDOWBOTTOM TEXT("WINDOWTOP")

#include <shlobj.h>

VOID watch();


LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp){

	//Paint
	HDC hdc;
	PAINTSTRUCT ps;
	static HDC hMemDC;
	static HBITMAP hBitmap;
	static BITMAP bitmap;

	//Sound
	static MCI_OPEN_PARMS mop,endmop;
	int iErr,iErr2;
	TCHAR strErr[BUFFER_SIZE],strErr2[BUFFER_SIZE];
	
	//Text
	//TEXTMETRIC tm;
	//TCHAR str[64];

	//Menu
	static MENUITEMINFO mii;
	POINT pt;
	static HMENU hMenu, hSubMenu;

	//ini
	static DWORD windTop;
	static TCHAR strss[0xFF],strst[0xFF];


	//window
	RECT winRect;
	int windowLeft;
	int windowBottom;

	//pass
	char szPath[_MAX_PATH];
	char desktopPath[_MAX_PATH];
	char linkPath[_MAX_PATH];
	char linkName[_MAX_PATH] = "\\Misaka.lnk";

	switch(msg){
		case WM_DESTROY:
			DeleteDC(hMemDC);
			DeleteObject(hBitmap);
			mciSendCommand(mop.wDeviceID,MCI_CLOSE,0,0);
			mciSendCommand(endmop.wDeviceID,MCI_CLOSE,0,0);

			PostQuitMessage(0);
			break;
		case WM_CREATE:
			//位置
			windowBottom = GetPrivateProfileInt(INT_SECNAME2 , INI_WINDOWBOTTOM , 0 , INI_FILE);
			windowLeft = GetPrivateProfileInt(INT_SECNAME3 , INI_WINDOWLEFT , 0 , INI_FILE);

			//画面表示
			MoveWindow(hWnd, windowLeft, windowBottom, 100, 270, TRUE);
			SetLayeredWindowAttributes(hWnd, RGB(0, 0, 255), 0, LWA_COLORKEY);
			
			//タイマー
			SetTimer(hWnd,1,100,NULL);

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//		メニュー
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////

			mii.cbSize = sizeof(MENUITEMINFO);
			mii.fMask = MIIM_TYPE|MIIM_ID;
			mii.fType = MFT_STRING;

			hMenu = CreateMenu();
			hSubMenu = CreatePopupMenu();

			mii.fMask = MIIM_TYPE | MIIM_ID;
			mii.dwTypeData = TEXT("最前表示");
			mii.wID = IDM_WIND;
			InsertMenuItem(hSubMenu , 0 , TRUE , &mii);

			mii.dwTypeData = TEXT("Windows起動時に起動");
			mii.wID = IDM_SET;
			InsertMenuItem(hSubMenu , 1 , TRUE , &mii);

			mii.dwTypeData = TEXT("-");
			mii.wID = IDM_HOGE;
			InsertMenuItem(hSubMenu , 2 , TRUE , &mii);

			mii.dwTypeData = TEXT("終了");
			mii.wID = IDM_END;
			InsertMenuItem(hSubMenu , 3 , TRUE , &mii);

			mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
			mii.hSubMenu = hSubMenu;
			mii.dwTypeData = TEXT("ファイル");
			InsertMenuItem(hMenu , 0 , TRUE , &mii);

			//SetMenu(hWnd , hMenu);

			//////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//		Path
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////

			GetModuleFileName(NULL, szPath, sizeof(szPath));
			SHGetSpecialFolderPath(hWnd,desktopPath,CSIDL_STARTUP,FALSE);
			strcpy(linkPath,desktopPath);
			strcat(linkPath,linkName);

			//////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//		最前表示設定
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////

			mii.cbSize = sizeof(MENUITEMINFO);
			mii.fMask = MIIM_STATE;

			windTop = GetPrivateProfileInt(INT_SECNAME , INI_VALUENAME , 0 , INI_FILE);
			if(windTop==1){
				//最前面表示の設定
				SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE));
				GetMenuItemInfo(hSubMenu,IDM_WIND,FALSE,&mii);
				mii.fState = MFS_CHECKED;
				SetMenuItemInfo(hSubMenu,IDM_WIND,FALSE,&mii);
			}else if(windTop==0){
				//最前面表示の解除
				SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE));
			}

			//////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//	音声
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////

			mop.dwCallback = (DWORD)hWnd;
			mop.lpstrDeviceType = (LPTSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
			mop.lpstrElementName = TEXT("bin/voice01.wav");

			endmop.dwCallback = (DWORD)hWnd;
			endmop.lpstrDeviceType = (LPTSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
			endmop.lpstrElementName = TEXT("bin/end.wav");

			iErr = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,(DWORD)&mop);
			iErr2 = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,(DWORD)&endmop);

			if(iErr){
				mciGetErrorString(iErr,strErr,BUFFER_SIZE);
				MessageBox(hWnd,strErr,NULL,MB_OK);
				return -1;
			}
			if(iErr2){
				mciGetErrorString(iErr2,strErr2,BUFFER_SIZE);
				MessageBox(hWnd,strErr2,NULL,MB_OK);
				return -1;
			}
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//	画像
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////

			hMemDC = CreateCompatibleDC(NULL);
			hBitmap = LoadImage(NULL , BMPFILE , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE);

			SelectObject(hMemDC , hBitmap);
			GetObject(hBitmap , sizeof(BITMAP) , &bitmap);

			return 0;
		case WM_PAINT:
			hdc = BeginPaint(hWnd , &ps);
			BitBlt(hdc , 0 , 0 , bitmap.bmWidth , bitmap.bmHeight ,	hMemDC , 0 , 0 , SRCCOPY);
			
			//Watch
			Rectangle(hdc,0,200,100,260);
			watch(hdc,hWnd);
			EndPaint(hWnd , &ps);
			return 0;
		case WM_RBUTTONDOWN:
			mciSendCommand(endmop.wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,0);
			mciSendCommand(endmop.wDeviceID,MCI_PLAY,0,0);
			return 0;
		case WM_RBUTTONUP:
			pt.x = LOWORD(lp);
			pt.y = HIWORD(lp);
			ClientToScreen(hWnd , &pt);
			TrackPopupMenu(hSubMenu , TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,pt.x , pt.y , 0 , hWnd , NULL);
			return 0;
		case WM_MBUTTONDOWN:
			mciSendCommand(mop.wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,0);
			mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
			return 0;
		case WM_LBUTTONDOWN:
			PostMessage(hWnd,WM_NCLBUTTONDOWN,(WPARAM)HTCAPTION,lp);
			return 0;
		case WM_COMMAND:
			mii.cbSize = sizeof(MENUITEMINFO);
			mii.fMask = MIIM_STATE;

			switch(LOWORD(wp)){
			case IDM_WIND:
				if(windTop==0){
					//最前面表示の設定
					SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE));
					windTop = 1;
					wsprintf(strss , TEXT("%s=%d\0") , INI_VALUENAME , windTop);

					WritePrivateProfileSection(INT_SECNAME , strss , INI_FILE);
					GetMenuItemInfo(hSubMenu,IDM_WIND,FALSE,&mii);
					mii.fState = MFS_CHECKED;
					SetMenuItemInfo(hSubMenu,IDM_WIND,FALSE,&mii);
				}else if(windTop==1){
					//最前面表示の解除
					SetWindowPos( hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE));
					windTop = 0;
					wsprintf(strss , TEXT("%s=%d\0") , INI_VALUENAME , windTop);

					WritePrivateProfileSection(INT_SECNAME , strss , INI_FILE);
					GetMenuItemInfo(hSubMenu,IDM_WIND,FALSE,&mii);
					mii.fState = MFS_UNCHECKED;
					SetMenuItemInfo(hSubMenu,IDM_WIND,FALSE,&mii);
				}
				return 0;
			case IDM_SET:
				return 0;
			case IDM_HOGE:
				return 0;
			case IDM_END:
				//座標
				GetWindowRect( hWnd, &winRect );
				windowLeft = winRect.left;
				windowBottom = winRect.top;
				//write
				wsprintf(strst , TEXT("%s=%d\0") , INI_WINDOWBOTTOM , windowBottom);
				WritePrivateProfileSection(INT_SECNAME2 , strst , INI_FILE);
				wsprintf(strst , TEXT("%s=%d\0") , INI_WINDOWLEFT , windowLeft);
				WritePrivateProfileSection(INT_SECNAME3 , strst , INI_FILE);

				PostQuitMessage(0);
				return 0;
			}
		case WM_TIMER:
			watch();
			InvalidateRect(hWnd,NULL,TRUE);
			return 0;
		default:
			return DefWindowProc(hWnd,msg,wp,lp);
	}
	return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp);

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR pCmdLine,int showCmd){
	WNDCLASSEX wc;
	HWND hWnd;
	MSG msg;

	wc.cbSize = sizeof(wc);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInst;
	wc.hIcon = LoadIcon(hInst, "ICON");
	wc.hIconSm = wc.hIcon;
	wc.hCursor = LoadCursor(NULL,IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
	wc.lpszMenuName = NULL;
	wc.lpszClassName = APP_NAME;

	if(RegisterClassEx(&wc) == 0){return 1;}

	//WS_OVERLAPPEDWINDOW
	hWnd = CreateWindowEx(WS_EX_LAYERED,wc.lpszClassName,APP_NAME,WS_POPUP|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);

	if(hWnd == NULL){return 1;}

	while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg);DispatchMessage(&msg);}
	return msg.wParam;
}
VOID watch(HDC hdc){
	//TCHAR watchStr[64];//整数を文字列にする際に必要

	time_t t = time(NULL);
	struct tm *dt;
	char s[128];
	char v[128];
	char u[128];

	dt = localtime(&t);

	strftime(s, 128, "%Y年", dt);
	strftime(v, 128,"%m/%d(%a)",dt);
	strftime(u, 128, "%H:%M:%S", dt);

	SetBkMode(hdc,TRANSPARENT);
	//wsprintf(watchStr , "%d" , s);
	TextOut(hdc,0,200,s,lstrlen(s));
	TextOut(hdc,0,218,v,lstrlen(v));
	TextOut(hdc,0,236,u,lstrlen(u));
}