const fs = require('fs');
const cheerio = require('cheerio');
const UglifyJS = require("uglify-js");

const rootFolder = 'player/';
const bm_version = '5.7.0';
const buildReducedVersion = process.argv[2] === 'reduced'
const defaultBuilds = ['full','svg_light','svg','canvas','html', 'canvas_light', 'html_light', 'canvas_worker']

const scripts = [
	{
		src: 'js/main.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/common.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/BaseEvent.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/helpers/arrays.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/helpers/svg_elements.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/utils/helpers/html_elements.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/helpers/dynamicProperties.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/helpers/blendModes.js',
		builds: defaultBuilds
	},
	{
		src: 'js/3rd_party/transformation-matrix.js',
		builds: defaultBuilds
	},
	{
		src: 'js/3rd_party/seedrandom.js',
		builds: defaultBuilds
	},
	{
		src: 'js/3rd_party/BezierEaser.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/animationFramePolyFill.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/functionExtensions.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/bez.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/DataManager.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/DataManagerWorkerOverrides.js',
		builds: ['canvas_worker']
	},
	{
		src: 'js/utils/FontManager.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/FontManagerWorkerOverride.js',
		builds: ['canvas_worker']
	},
	{
		src: 'js/utils/PropertyFactory.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/TransformProperty.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/shapes/ShapePath.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/shapes/ShapeProperty.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/shapes/ShapeModifiers.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/shapes/TrimModifier.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/shapes/RoundCornersModifier.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/shapes/RepeaterModifier.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/shapes/ShapeCollection.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/shapes/DashProperty.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/shapes/GradientProperty.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/shapes/shapePathBuilder.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/imagePreloader.js',
		builds: ['full','canvas','canvas_light','html','html_light','svg','svg_light']
	},
	{
		src: 'js/utils/imagePreloaderWorkerOverride.js',
		builds: ['canvas_worker']
	},
	{
		src: 'js/utils/featureSupport.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/filters.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/asset_loader.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/asset_loader_worker_override.js',
		builds: ['canvas_worker']
	},
	{
		src: 'js/utils/text/TextAnimatorProperty.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/text/TextAnimatorDataProperty.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/text/LetterProps.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/text/TextProperty.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/text/TextSelectorProperty.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/pooling/pool_factory.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/pooling/pooling.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/pooling/point_pool.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/pooling/shape_pool.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/pooling/shapeCollection_pool.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/pooling/segments_length_pool.js',
		builds: defaultBuilds
	},
	{
		src: 'js/utils/pooling/bezier_length_pool.js',
		builds: defaultBuilds
	},
	{
		src: 'js/renderers/BaseRenderer.js',
		builds: defaultBuilds
	},
	{
		src: 'js/renderers/SVGRenderer.js',
		builds: defaultBuilds
	},
	{
		src: 'js/renderers/CanvasRenderer.js',
		builds: ['full','canvas','canvas_light','canvas_worker']
	},
	{
		src: 'js/renderers/CanvasRendererWorkerOverride.js',
		builds: ['canvas_worker']
	},
	{
		src: 'js/renderers/HybridRenderer.js',
		builds: ['full','html','html_light']
	},
	{
		src: 'js/mask.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/helpers/HierarchyElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/helpers/FrameElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/helpers/TransformElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/helpers/RenderableElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/helpers/RenderableDOMElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/helpers/shapes/ProcessedElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/helpers/shapes/SVGStyleData.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/helpers/shapes/SVGShapeData.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/helpers/shapes/SVGTransformData.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/helpers/shapes/SVGStrokeStyleData.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/helpers/shapes/SVGFillStyleData.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/helpers/shapes/SVGGradientFillStyleData.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/helpers/shapes/SVGGradientStrokeStyleData.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/helpers/shapes/ShapeGroupData.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/helpers/shapes/SVGElementsRenderer.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/helpers/shapes/ShapeTransformManager.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/helpers/shapes/CVShapeData.js',
		builds: ['full','canvas','canvas_light','canvas_worker']
	},
	{
		src: 'js/elements/BaseElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/NullElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/svgElements/SVGBaseElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/ShapeElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/TextElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/CompElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/ImageElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/SolidElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/svgElements/SVGCompElement.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/svgElements/SVGTextElement.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/svgElements/SVGShapeElement.js',
		builds: defaultBuilds
	},
	{
		src: 'js/elements/svgElements/effects/SVGTintEffect.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/svgElements/effects/SVGFillFilter.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/svgElements/effects/SVGGaussianBlurEffect.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/svgElements/effects/SVGStrokeEffect.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/svgElements/effects/SVGTritoneFilter.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/svgElements/effects/SVGProLevelsFilter.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/svgElements/effects/SVGDropShadowEffect.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/svgElements/effects/SVGMatte3Effect.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/svgElements/SVGEffects.js',
		builds: ['full','svg','svg_light','html','html_light']
	},
	{
		src: 'js/elements/canvasElements/CVContextData.js',
		builds: ['full','canvas','canvas_light','canvas_worker']
	},
	{
		src: 'js/elements/canvasElements/CVBaseElement.js',
		builds: ['full','canvas','canvas_light','canvas_worker']
	},
	{
		src: 'js/elements/canvasElements/CVImageElement.js',
		builds: ['full','canvas','canvas_light']
	},
	{
		src: 'js/elements/canvasElements/CVCompElement.js',
		builds: ['full','canvas','canvas_light','canvas_worker']
	},
	{
		src: 'js/elements/canvasElements/CVMaskElement.js',
		builds: ['full','canvas','canvas_light','canvas_worker']
	},
	{
		src: 'js/elements/canvasElements/CVShapeElement.js',
		builds: ['full','canvas','canvas_light','canvas_worker']
	},
	{
		src: 'js/elements/canvasElements/CVSolidElement.js',
		builds: ['full','canvas','canvas_light','canvas_worker']
	},
	{
		src: 'js/elements/canvasElements/CVTextElement.js',
		builds: ['full','canvas','canvas_light']
	},
	{
		src: 'js/elements/canvasElements/CVEffects.js',
		builds: ['full','canvas','canvas_light','html','html_light','canvas_worker']
	},
	{
		src: 'js/elements/htmlElements/HBaseElement.js',
		builds: ['full','html','html_light']
	},
	{
		src: 'js/elements/htmlElements/HSolidElement.js',
		builds: ['full','html','html_light']
	},
	{
		src: 'js/elements/htmlElements/HCompElement.js',
		builds: ['full','html','html_light']
	},
	{
		src: 'js/elements/htmlElements/HShapeElement.js',
		builds: ['full','html','html_light']
	},
	{
		src: 'js/elements/htmlElements/HTextElement.js',
		builds: ['full','html','html_light']
	},
	{
		src: 'js/elements/htmlElements/HImageElement.js',
		builds: ['full','html','html_light']
	},
	{
		src: 'js/elements/htmlElements/HCameraElement.js',
		builds: ['full','html','html_light']
	},
	{
		src: 'js/elements/htmlElements/HEffects.js',
		builds: ['full','html','html_light']
	},
	{
		src: 'js/animation/AnimationManager.js',
		builds: defaultBuilds
	},
	{
		src: 'js/animation/AnimationManagerWorkerOverride.js',
		builds: ['canvas_worker']
	},
	{
		src: 'js/animation/AnimationItem.js',
		builds: defaultBuilds
	},
	{
		src: 'js/animation/AnimationItemWorkerOverride.js',
		builds: ['canvas_worker']
	},
	{
		src: 'js/utils/expressions/Expressions.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/ExpressionManager.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/expressionHelpers.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/ExpressionPropertyDecorator.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/ExpressionTextPropertyDecorator.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/shapes/ShapePathInterface.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/PropertyGroupFactory.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/PropertyInterface.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/ShapeInterface.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/TextInterface.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/LayerInterface.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/CompInterface.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/TransformInterface.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/ProjectInterface.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/EffectInterface.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/MaskInterface.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/ExpressionValueFactory.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/utils/expressions/TextSelectorPropertyDecorator.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/effects/SliderEffect.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	},
	{
		src: 'js/effects/EffectsManagerPlaceholder.js',
		builds: defaultBuilds
	},
	{
		src: 'js/EffectsManager.js',
		builds: ['full','svg','canvas','html','canvas_worker']
	}
]

function loadIndex() {
	return new Promise((resolve, reject)=>{

		function onLoad(err, result) {
			if(err) {
				reject(err);
			} else {
				resolve(result);
			}
		}
		fs.readFile(`${rootFolder}index.html`, 'utf8', onLoad);
	})
}

function parseHTML(html) {
	return new Promise((resolve, reject)=> {
		try {
			const $ = cheerio.load(html);
			resolve($);
		} catch(err) {
			reject(err);
		}
	})
}

function getScripts($) {
	return new Promise((resolve, reject)=> {
		try {
			const scriptNodes = []
			let shouldAddToScripts = false;
			$("head").contents().each((index, node) => {
				if(node.nodeType === 8 && node.data.indexOf('build:js') !== -1) {
					shouldAddToScripts = true;
				} else if(shouldAddToScripts) {
					if(node.type === 'script') {

						scriptNodes.push(node)
					} else if(node.nodeType === 8 && node.data.indexOf('endbuild') !== -1) {
						shouldAddToScripts = false;
					}
				}
			})
			const scripts = scriptNodes.map((node)=>{
				const builds = node.attribs['data-builds'] ? node.attribs['data-builds'].split(',') : defaultBuilds
				return {
					src: node.attribs.src,
					builds: builds,
				}
			})
			resolve(scripts);
		} catch(err) {
			reject(err);
		}

	})
}

function concatScripts(scripts, build) {
	return new Promise((resolve, reject)=>{
		// Concatenating scripts
		try {
			let scriptsString = ''
			scripts.forEach((script)=> {
				if(script.builds.indexOf(build) !== -1) {
					scriptsString += fs.readFileSync(`${rootFolder}${script.src}`, {encoding: 'utf8'});
					scriptsString += '\r\n';
				}
			})
			resolve(scriptsString);
		} catch(err) {
			reject(err);
		}
	});
}

function wrapScriptWithModule(code, build) {
	return new Promise((resolve, reject)=>{
		try {
			// Wrapping with module
			let moduleFileName = (build =='canvas_worker') ? 'module_worker' : 'module';
			let wrappedCode = fs.readFileSync(`${rootFolder}js/${moduleFileName}.js`, "utf8");
			wrappedCode = wrappedCode.replace('/*<%= contents %>*/',code);
			wrappedCode = wrappedCode.replace('[[BM_VERSION]]',bm_version);
			resolve(wrappedCode);
		} catch(err) {
			reject(err);
		}
	});
}

function uglifyCode(code) {
	return new Promise((resolve, reject)=>{
		try {
			const result = UglifyJS.minify(code, {
				output: 
					{
						ascii_only:true
					},
					toplevel:true,
					mangle: {
						reserved: ['lottie']
					}
				});
			if (result.error) {
				reject(result.error)
			} else {
				resolve(result.code)
			}
		} catch(err) {
			reject(err)
		}
	})
}

async function modularizeCode(code) {
	return `(typeof navigator !== "undefined") && (function(root, factory) {
    if (typeof define === "function" && define.amd) {
        define(function() {
            return factory(root);
        });
    } else if (typeof module === "object" && module.exports) {
        module.exports = factory(root);
    } else {
        root.lottie = factory(root);
        root.bodymovin = root.lottie;
    }
}((window || {}), function(window) {
	${code}
return lottie;
}));`
}

async function buildVersion(scripts, version) {
	const code = await concatScripts(scripts, version.build)
	const wrappedCode = await wrapScriptWithModule(code, version.build)
	const processedCode = await version.process(wrappedCode)
	const modularizedCode = await modularizeCode(processedCode)
	const saved = await save(modularizedCode, version.fileName)
	return true
}

function save(code, fileName) {
	return new Promise((resolve, reject)=> {
		fs.writeFile(`build/player/${fileName}`, code, (err) => {
			if (err) {
				reject(err)
			} else {
				resolve('File Saved')
			}
		});
	})
}

function noop(code) {
	return Promise.resolve(code)
}

function buildVersions(scripts) {
	return new Promise((resolve, reject) => {
		let versions = [
		{
			fileName: 'lottie.js',
			build: 'full',
			process: noop
		},
		{
			fileName: 'lottie.min.js',
			build: 'full',
			process: uglifyCode
		},
		{
			fileName: 'lottie_light.js',
			build: 'svg_light',
			process: noop
		},
		{
			fileName: 'lottie_light.min.js',
			build: 'svg_light',
			process: uglifyCode
		},
		{
			fileName: 'lottie_svg.js',
			build: 'svg',
			process: noop
		},
		{
			fileName: 'lottie_svg.min.js',
			build: 'svg',
			process: uglifyCode
		},
		{
			fileName: 'lottie_light_canvas.js',
			build: 'canvas_light',
			process: noop
		},
		{
			fileName: 'lottie_light_canvas.min.js',
			build: 'canvas_light',
			process: uglifyCode
		},
		{
			fileName: 'lottie_canvas.js',
			build: 'canvas',
			process: noop
		},
		{
			fileName: 'lottie_canvas.min.js',
			build: 'canvas',
			process: uglifyCode
		},
		{
			fileName: 'lottie_canvas_worker.js',
			build: 'canvas_worker',
			process: noop
		},
		{
			fileName: 'lottie_canvas_worker.min.js',
			build: 'canvas_worker',
			process: uglifyCode
		},
		{
			fileName: 'lottie_html.js',
			build: 'html',
			process: noop
		},
		{
			fileName: 'lottie_html.min.js',
			build: 'html',
			process: uglifyCode
		},
		{
			fileName: 'lottie_light_html.js',
			build: 'html_light',
			process: noop
		},
		{
			fileName: 'lottie_light_html.min.js',
			build: 'html_light',
			process: uglifyCode
		}];

		if (buildReducedVersion) {
			versions = versions.splice(0,1);
		}

		const buildProcesses = versions.map((version)=>{
			return buildVersion(scripts, version)
		})
		Promise.all(buildProcesses)
		.then(() => {
			resolve('Build Process Ended')
		})
		.catch((err)=>{
			reject(err)
		})
	})
}

function handleError(err) {
	console.log(err);
}

async function build() {
	try {
		const htmlData = await loadIndex();
		const parsedData = await parseHTML(htmlData);
		// const scripts = await getScripts(parsedData);
		const result = await buildVersions(scripts);
		console.log(result);

	} catch(err) {
		handleError(err);
	}
}

build()
