class SaveFile {
	constructor() {
		this.filename = null;
		this.callbackComplete = null;
		this.callbackError = null;
	}

	// ブラウザ上で実行している場合のファイル保存処理
	saveFileBrowser(filename, data) {
		// Blobに変換して download
		let blob = new Blob([data], { type: "text/plain" });
		let a = document.createElement('a');
		a.href = URL.createObjectURL(blob);
		a.target = '_blank';
		a.download = filename;	// Edgeは無効……
		a.click();

		// download完了後に memory解放したほうがいい
		// URL.revokeObjectURL();
	};

	// アプリケーションとして実行している場合のファイル保存処理
	saveFileApp(filename, data, callbackComplete, callbackError) {
		if (null != callbackComplete) this.callbackComplete = callbackComplete;
		if (null != callbackError) this.callbackError = callbackError;

		// Unique filename作成 (ABC.txtが既にある → ABC(1).txt という file nameになる
		// write, append指定はerrorになる。filepickerかmanifestで権限取得する必要があるかも
		let fileoption = Windows.Storage.CreationCollisionOption.generateUniqueName;
		Windows.Storage.DownloadsFolder.createFileAsync(filename, fileoption).done(this.saveFileAppOpenFile.bind(this, data), this.saveFileError.bind(this));
	};

	// 以下、Private関数 -------------------

	saveFileAppOpenFile(savedata, file) {	// [!!caution] callback設定時に savedataを無理やりbind済み
		// 実際に書き込まれた file nameを取得
		let name = file.name;
		// file objectの pathを参照すると保存先 folderが大変なことになっているが
		// 実際に保存される場所は Downloads/<ApplicationName>/ になる

		// この時点で fileは既に open済みになっている
		// fileへデータ書き込み
		Windows.Storage.FileIO.writeTextAsync(file, savedata);
		// 書き込み完了チェック
		Windows.Storage.CachedFileManager.completeUpdatesAsync(file).done(this.saveFileComplete.bind(this), this.saveFileError.bind(this));

	};
	saveFileComplete() {
		// 保存完了
		debuglog('ファイル保存完了');

		if (null != this.callbackComplete) this.callbackComplete();
	};
	saveFileError(err) {
		console.error('ファイル保存エラー\nerror=' + err.message + 'description=' + err.description);
		if (null != this.callbackError) this.callbackError(err.message);
	};
}	// class SaveFile