/** apikey.cpp
 * APIキーの管理：C++ソース
 *
 * @copyright	(c)studio pahoo
 * @author		パパぱふぅ
 * @開発環境	MinGW C++
 * @参考URL		http://www.pahoo.org/e-soul/webtech/cpp01-15-01.shtm
 */
#include <iostream>
#include <fstream>
#include <tchar.h>
#include "apikey.h"
#include "mystrings.h"
#include "resource.h"

using namespace std;

// 外部変数 ================================================================
//現在のインターフェイス
extern HINSTANCE hInst;

//APIキー名
string idName = "";

//APIキー(一時保存用)
string apiKey = "";

//APIキー保存ファイル名
string fileName = "";

//APIキー取得URL
string getUrl = "";

/**
 * APIキーを読み込む
 * @param	string fname 読み込むファイル名（パスを除く）
 * @param	string *key  APIキーを格納する変数
 * @return	bool TRUE：読込成功／FALSE：ファイルがない
 */
bool readApiKey(std::string fname, std::string* key) {
	string readKey;
	bool ret = FALSE;

	ifstream ifs((string)getMyPath(NULL) + fname);
	if (!ifs)	return ret;

	ifs >> readKey;
	if(ifs.bad()) {
		ifs.close();
		return FALSE;
	}
	ifs.close();

	//APIキーを格納する
	if (readKey.length() > 0) {
		*key = readKey;
		ret = TRUE;
	//APIキーを削除する
	} else {
		*key = "";
	}

	return ret;
}

/**
 * APIキーを書き込む
 * @param	string fname    書き込むファイル名（パスを除く）
 * @param	string key      書き込むAPIキー
 * @return	bool TRUE：書込成功／FALSE：失敗
 */
bool writeApiKey(std::string fname, std::string key) {
	bool ret = TRUE;
	ofstream ofs;

	ofs.open((string)getMyPath(NULL) + fname);
	ofs << key;
	if(ofs.bad()) {
		ret = FALSE;
	}
	ofs.close();

	return ret;
}

/**
 * イベントハンドラ：APIキーID入力ダイアログ
 * @param	HWND hDlg			ウィンドウ・ハンドラ
 * @paramm	UINT uMsg			メッセージ識別子
 * @param	WPARAM wParam		メッセージの最初のパラメータ
 * @paramL	PARAM lParam		メッセージの2番目のパラメータ
 * @return	INT_PTR CALLBACK	TRUE：メッセージ処理完了／FALSE：未完了
 */
INT_PTR CALLBACK processSetAPIkey(HWND hDlg, UINT uMsg,
					WPARAM wParam, LPARAM lParam) {
	ofstream ofs;
	int res;
	string caption = idName + "設定";
	string message = idName + "を入力・保存・削除します．\n\nキーを新規取得したいときは，[取得]ボタンを押下してください．ブラウザを使ってキー取得ページを開きます．";
	string confirm = idName + "削除";

	switch (uMsg) {
	//ダイアログ初期化
	case WM_INITDIALOG:
		CenterWindow(hDlg);
		SetWindowText(hDlg, caption.c_str());
		setStrEditBox(hDlg, IDC_TEXT_APIKEY, message);
		setStrEditBox(hDlg, IDC_EDIT_APIKEY, apiKey);
		break;

	//ボタン押下
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		//取得（ブラウザを開く）
		case IDC_BUTTON_APIKEY_GET:
			ShellExecute(NULL, _T("open"), getUrl.c_str(), NULL, NULL, SW_RESTORE);
			break;
		//保存
		case IDC_BUTTON_APIKEY_SAVE:
			writeApiKey(fileName, getStrEditBox(hDlg, IDC_EDIT_APIKEY));
			EndDialog(hDlg, 0);
			break;
		//削除
		case IDC_BUTTON_APIKEY_DELETE:
			res = MessageBox(NULL, TEXT("本当に削除しますか？"),
				confirm.c_str(), MB_OKCANCEL | MB_ICONQUESTION);
			switch (res) {
			case IDOK:
				writeApiKey(fileName, "");
				break;
			default:
				break;
			}
			EndDialog(hDlg, 0);
			break;
		//キャンセル
		case IDC_BUTTON_APIKEY_CANCEL:
			EndDialog(hDlg, 0);
			break;
		default:
			return 1;
		}
		break;
	//プログラム終了
	case WM_CLOSE:
		EndDialog(hDlg, 0);
		break;
	}
	return 0;
}

/**
 * クラウドサービスAPIのキー入力ダイアログを作成
 * @param  HWND   hDlg	親ウィンドウ・ハンドラ
 * @param  string name	キー名称
 * @param  string fname	キー保存ファイル名
 * @param  string url	キー取得URL
 * @param  string* key	APIキーを格納する変数
 * @return なし
 */
void createSetAPIkey(HWND hDlg, std::string name,
		std::string fname, std::string url, std::string* key) {
	idName = name;
	fileName = fname;
	getUrl = url;

	apiKey = *key;
	DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_SETAPIKEY), hDlg,
			(DLGPROC)processSetAPIkey);

	readApiKey(fname, key);
}

/*
 ** バージョンアップ履歴 =====================================================
 *
 * @version 2.0.0 2024/04/29  createSetAPIkey, processSetAPIkey に統合
 * @version 1.0   2020/09/30  初版
 */
