/* ***** BEGIN LICENSE BLOCK *****
	Copyright (c) 2018-2020 Famibee (famibee.blog38.fc2.com)

	This software is released under the MIT License.
	http://opensource.org/licenses/mit-license.php
** ***** END LICENSE BLOCK ***** */

import {CmnLib, getDateStr} from './CmnLib';
import {HArg, ITag, IHTag} from './CmnInterface';
import {SysBase} from './SysBase';
import {ScriptIterator} from './ScriptIterator';

export class DebugMng {
	private	static	scrItr	: ScriptIterator;
	private	static	hTag	: IHTag;
	private static	title	: ITag;
	private static	spnDbg	: HTMLSpanElement;

	constructor(private readonly sys: SysBase, hTag: IHTag, scrItr: ScriptIterator) {
		DebugMng.scrItr = scrItr;
		DebugMng.hTag = hTag;
		DebugMng.title = hTag.title;
		DebugMng.myTrace = DebugMng.fncMyTrace;

		//	デバッグ・その他
		//hTag.clearsysvar	// Variableで定義				// システム変数の全消去
		//hTag.clearvar		// Variableで定義				// ゲーム変数の全消去
		//hTag.dump_lay		// LayerMngで定義				// レイヤのダンプ
		//hTag.dump_val		// Variableで定義				// 変数のダンプ
		//hTag.dump_stack	// ScriptIteratorで定義			// スタックのダンプ
		hTag.log			= o=> this.log(o);				// ログ出力
		//hTag.reload_script// ScriptIterator.ts内で定義	// スクリプト再読込
		hTag.trace			= o=> this.trace(o);			// デバッグ表示へ出力

		DebugMng.spnDbg = document.createElement('span');
		DebugMng.spnDbg.hidden = true;
		DebugMng.spnDbg.textContent = '';
		DebugMng.spnDbg.style.cssText =
		`	z-index: ${Number.MAX_SAFE_INTEGER};
			position: absolute; left: 0; top: 0;
			color: black;
			background-color: rgba(255, 255, 255, 0.7);`
		document.body.appendChild(DebugMng.spnDbg);
	}
	destroy() {
		DebugMng.title = ()=> false;
		document.body.removeChild(DebugMng.spnDbg);
	}

	// ログ出力
	private	first = true;
	private log(hArg: HArg) {
		let dat = '';
		if (this.first) {
			this.first = false;
			dat = `== ${CmnLib.platform.description} ==\n`;
		}
		this.sys.appendFile(
			this.sys.path_downloads +'log.txt',
			`${dat}--- ${getDateStr('-', '_', '')
			} [fn:${DebugMng.scrItr.scriptFn} line:${DebugMng.scrItr.lineNum
			}] prj:${this.sys.cur
			}\n${hArg.text || `(text is ${hArg.text})`}\n`,
			err=> {if (err) console.log(err)}
		);

		return false;
	}

	private trace(hArg: HArg) {
		DebugMng.myTrace(hArg.text || `(text is ${hArg.text})`, 'I');

		return false;
	}

	static myTrace	= (txt: string, lvl: 'D'|'W'|'F'|'E'|'I'|'ET' = 'E')=> {
		let mes = `{${lvl}} `+ txt;
		let sty = '';
		switch (lvl) {
			case 'D':	sty = `color:#${CmnLib.isDarkMode ?'49F' :'05A'};`;	break;
			case 'W':	sty = 'color:#FF8800;';	break;
			case 'F':	sty = 'color:#BB0000;';	break;
			case 'ET':	throw mes;
			case 'E':	console.error('%c'+ mes, 'color:#FF3300;');	return;
			default:	sty = 'color:black;';	mes = ' '+ mes;
		}
		console.info('%c'+ mes, sty);
	}
	private static fncMyTrace(txt: string, lvl: 'D'|'W'|'F'|'E'|'I'|'ET' = 'E') {
		let mes = `{${lvl}} `;
		if (DebugMng.scrItr && DebugMng.scrItr.lineNum > 0) mes +=
		`(fn:${DebugMng.scrItr.scriptFn} line:${DebugMng.scrItr.lineNum}) `;
		mes += txt;
		DebugMng.dspDbg(mes, lvl);

		let sty = '';
		switch (lvl) {
			case 'D':	sty = `color:#${CmnLib.isDarkMode ?'49F' :'05A'};`;	break;
			case 'W':	sty = 'color:#F80;';	break;
			case 'F':	sty = 'color:#B00;';	break;
			case 'ET':
			case 'E':	DebugMng.title({text: txt});
				/*if (CmnLib.osName === "AND") {
					const buf = "mailto:foo@hoge.co.jp"
						+ "?subject=AIRNovel_ERR&body="
						+ CmnLib.escapeZenkaku(mes) + "\n"
						+ "※一部記号は全角表示しています。";
					flash.net.navigateToURL(new URLRequest(buf));
				}*/
				this.hTag.dump_lay({});
				this.hTag.dump_val({});
				DebugMng.scrItr.dumpErrForeLine();
				this.hTag.dump_stack({});

				if (lvl === 'ET') throw mes;
				console.error('%c'+ mes, 'color:#F30;');	return;
			default:	sty = '';	mes = ' '+ mes;
		}
		console.info('%c'+ mes, sty);
	}

	private static	dspDbg(mes: string, lvl: 'D'|'W'|'F'|'E'|'I'|'ET') {
		let sty = '';
		switch (lvl) {
			case 'D':	sty = 'color:#05A;';	break;
			case 'W':	sty = 'color:#F80;';	break;
			case 'F':	sty = 'color:#B00;';	break;
			case 'ET':
			case 'E':	sty = 'color:#F30;';	break;
			default:	sty = '';
		}
		DebugMng.spnDbg.innerHTML += `<span style='${sty}'>${mes}</span><br/>`;
		DebugMng.spnDbg.hidden = false;
	};

}
