#include <Windows.h>
#include <tchar.h>

#include "tstring.h"
#include "tap_switch.h"

void usage(void)
{
	_tprintf(_T("tapsw_cui.exe [no] [option] ... tap switch を制御する\n"));
	_tprintf(_T("[option]\n"));
	_tprintf(_T("   -mcplist : 接続されている Mcp2221a の情報を表示する\n"));
	_tprintf(_T("   -tapnum  : 接続されている Tap Switch の数を表示する\n"));
	_tprintf(_T("   -set     : [no] で指定した Mcp2221a を Tap Switch 用に設定する\n"));
	_tprintf(_T("   -on      : [no] で指定した Tap Switch を ON する\n"));
	_tprintf(_T("   -off     : [no] で指定した Tap Switch を OFF する\n"));
}

int _tmain(int argc, TCHAR ** argv)
{
	TCHAR current[_MAX_PATH];
	TCHAR filename[_MAX_FNAME];
	std::tstring dllpath;

	memset(current, '\0', sizeof(current));
	memset(filename, '\0', sizeof(filename));

	GetModuleFileName(NULL, current, MAX_PATH);	// パス取得
	dllpath = current;
	dllpath.erase((dllpath.begin() + dllpath.rfind(_T("\\")) + 1), dllpath.end());	// ディレクトリ部分だけ抜き取る

	char2tchar(filename, dllname, _countof(filename));

	dllpath += filename;

	HMODULE hm = LoadLibrary(dllpath.c_str());
	
	if (hm != nullptr) {

		// ライブラリロード成功
		// 公開関数のアドレス取得
		_GETMCP2221ANUM getMcp2221aNum;
		_GETTAPSWITCHNUM getTapSwitchNum;
		_GETMCP2221AINFO getMcp2221aInfo;
		_SETMCP2221AFORTAPSWITCH setMcp2221aForTapSwitch;
		_SWITCHTAPSWITCH switchTapSwitch;

		getMcp2221aNum = (_GETMCP2221ANUM)GetProcAddress(hm, "getMcp2221aNum");
		getTapSwitchNum = (_GETTAPSWITCHNUM)GetProcAddress(hm, "getTapSwitchNum");
		getMcp2221aInfo = (_GETMCP2221AINFO)GetProcAddress(hm, "getMcp2221aInfo");
		setMcp2221aForTapSwitch = (_SETMCP2221AFORTAPSWITCH)GetProcAddress(hm, "setMcp2221aForTapSwitch");
		switchTapSwitch = (_SWITCHTAPSWITCH)GetProcAddress(hm, "switchTapSwitch");

		if (argc == 1) {
			usage();

		} else {

			int index = 1;
			unsigned int no = 0;		// mcp, switch のインデックス
			while (index < argc) {
				
				int ret = sscanf_s(argv[index], "%u", &no);
				if (ret > 0) {	// 数値入力
					++index;
					continue;
				}

				if (_tcscmp(argv[index], _T("-mcplist")) == 0) {
					// mcp2221a のリスト
					unsigned int num = getMcp2221aNum();
					_tprintf(_T("Found Mcp2221a ... %u unit.\n"), num);

					std::wstring manu;
					std::wstring pro;
					for (unsigned int i = 0; i < num; ++i) {
						if (getMcp2221aInfo(i, manu, pro)) {
							_tprintf(_T("---------------------------------------------\n"));
							_tprintf(_T("Mcp2221a[%u]\n"), i);
							_tprintf(_T("  Manufacture = %ws\n"), manu.c_str());
							_tprintf(_T("  Product     = %ws\n"), pro.c_str());
						}
					}
					break;

				} else if (_tcscmp(argv[index], _T("-tapnum")) == 0) {
					// tap switch のリスト
					unsigned int num = getTapSwitchNum();
					_tprintf(_T("Found Tap Switch ... %u unit.\n"), num);
					break;

				} else if (_tcscmp(argv[index], _T("-set")) == 0) {
					setMcp2221aForTapSwitch(no);
					break;

				} else if (_tcscmp(argv[index], _T("-on")) == 0) {
					switchTapSwitch(no, SW_ON);
					break;

				} else if (_tcscmp(argv[index], _T("-off")) == 0) {
					switchTapSwitch(no, SW_OFF);
					break;
				} else {
					usage();
					break;
				}
			}
		}
		FreeLibrary(hm);
	}
	else {
		_tprintf(_T("%s が見つかりません\n"), dllname);
	}

	return 0;
}