/* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */
package com.sheetjs;

import java.lang.Integer;
import java.util.Scanner;
import java.io.IOException;
import java.io.File;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.NativeObject;
import org.mozilla.javascript.Scriptable;

public class SheetJS {
	public Scriptable scope;
	public Context cx;
	public NativeObject nXLSX;

	public SheetJS() throws Exception {
		this.cx = Context.enter();
		this.scope = this.cx.initStandardObjects();

		/* boilerplate */
		cx.setOptimizationLevel(-1);
		String s = "var global = (function(){ return this; }).call(null);";
		cx.evaluateString(scope, s, "<cmd>", 1, null);

		/* eval library */
		s = new Scanner(SheetJS.class.getResourceAsStream("/xlsx.full.min.js")).useDelimiter("\\Z").next();
		//s = new Scanner(new File("xlsx.full.min.js")).useDelimiter("\\Z").next();
		cx.evaluateString(scope, s, "<cmd>", 1, null);

		/* grab XLSX variable */
		Object XLSX = scope.get("XLSX", scope);
		if(XLSX == Scriptable.NOT_FOUND) throw new Exception("XLSX not found");
		this.nXLSX = (NativeObject)XLSX;
	}

	public SheetJSFile read_file(String filename) throws IOException, ObjectNotFoundException {
		/* open file */
		String d = JSHelper.read_file(filename);

		/* options argument */
		NativeObject q = (NativeObject)this.cx.evaluateString(this.scope, "q = {'type':'binary', 'WTF':1};", "<cmd>", 2, null);

		/* set up function arguments */
		Object args[] = {d, q};

		/* call read -> wb workbook */
		Function readfunc = (Function)JSHelper.get_object("XLSX.read",this.scope);
		NativeObject wb = (NativeObject)readfunc.call(this.cx, this.scope, this.nXLSX, args);

		return new SheetJSFile(wb, this);
	}

	public static void close() { JSHelper.close(); }
}