/home/ivoiecob/email.hirewise-va.com/modules/MailWebclient/js/views/html-editor/SourceEditor.js
'use strict';

const
	codemirror = require('codemirror'),
	langHtml = require('@codemirror/lang-html'),
	parserHtml = require('prettier/parser-html'),
	prettier = require('prettier/standalone')
;

function formatHtml(text) {
	try {
		return prettier.format(text, {
			parser: 'html',
			plugins: [parserHtml]
		});
	} catch (error) {
		return text;
	}
}

module.exports = {
	view: null,
	htmlSourceDom: null,
	onChangeHandler: () => {},

	setHtmlSourceDom(htmlSourceDom) {
		this.htmlSourceDom = htmlSourceDom;
	},

	setOnChangeHandler(onChangeHandler) {
		this.onChangeHandler = onChangeHandler;
	},

	clear() {
		this.view = null;
	},

	isInitialized(){
		return this.view !== null;
	},

	getText() {
		return this.view && this.view.viewState && this.view.viewState.state && this.view.viewState.state.doc
			? this.view.viewState.state.doc.toString()
			: null;
	},

	setText(text) {
		const doc = formatHtml(text);
		if (this.view && this.view.viewState && this.view.viewState.state && this.view.viewState.state.doc) {
			this.view.dispatch({
				changes: {
					from: 0,
					to: this.view.viewState.state.doc.length,
					insert: doc
				}
			});
		} else {
			const parent = this.htmlSourceDom && this.htmlSourceDom.length ? this.htmlSourceDom[0] : null;
			if (parent) {
				const { EditorView, basicSetup } = codemirror;
				const { html } = langHtml;
				this.view = new EditorView({
					doc,
					extensions: [
						basicSetup,
						html(),
						EditorView.updateListener.of(() => {
							this.onChangeHandler(/*e.state.doc.toString()*/);
						})
					],
					parent
				});
			}
		}
	}
};