import MagicString from 'magic-string';

let indent_size = 4;
let comment_multi = true;
function get_processor(tag_name, search, replace) {
	return {
		[tag_name]: ({ content, filename }) => {
			let code = content.slice();
			const ms = new MagicString(code);

			const idx = ms.original.indexOf(search);
			if (idx == -1) throw new Error('search not found in src');
			ms.overwrite(idx, idx + search.length, replace, { storeName: true });

			// change line + column
			const indent = Array.from({ length: indent_size }).join(' ');
			ms.prependLeft(idx, '\n' + indent);

			const map_opts = { source: filename, hires: true, includeContent: false };
			const map = ms.generateMap(map_opts);
			const attach_line = (tag_name == 'style' || comment_multi)
				? `\n/*# sourceMappingURL=${map.toUrl()} */`
				: `\n//# sourceMappingURL=${map.toUrl()}` // only in script
			;
			code = ms.toString() + attach_line;

			indent_size += 2;
			if (tag_name == 'script') comment_multi = !comment_multi;
			return { code };
		}
	};
}

export default {
	preprocess: [

		get_processor('script', 'replace_me_script', 'done_replace_script_1'),
		get_processor('script', 'done_replace_script_1', 'done_replace_script_2'),

		get_processor('style', '.replace_me_style', '.done_replace_style_1'),
		get_processor('style', '.done_replace_style_1', '.done_replace_style_2')

	]
};