var fs = require('fs');
var path = require('path');

const {
        fork
} = require('child_process');

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Initialize codes.
AutoLoadPlugins();

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//You can load the plugins in global field, if the next line codes are uncommented.
AutoLoadGlobalPlugins();

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Sample codes.
exports.Test = function() {
        console.log("Hi, I'm a model test funciton");
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Put you codes here

var g_wait_form = false;
exports.wait = () => {
        var cmd = (unit.dir + '_entry.js');
        g_wait_form = fork(cmd, ['wait']);
        //g_wait_form.send('wait_cueline', 'test');
};

exports.cueline = (info) => {
        if (g_wait_form && g_wait_form.send) {
                //g_wait_form.send('wait_cueline', '' + info);
                //exports.ide_info(info);

                g_wait_form.send({
                        type: 'wait_cueline',
                        info: info
                });
        }
};

exports.stop = () => {
        var timeID = setInterval(() => {
                if (g_wait_form) {
                        clearInterval(timeID);

                        g_wait_form.send({
                                type: "close",
                                form: 'wait'
                        });
                        g_wait_form = false;
                }
        }, 100);
};

exports.updateGeometry = (geometry) => {
        if (g_wait_form) {
                g_wait_form.send({
                        type: "setGeometry",
                        geometry: geometry,
                        form: 'wait'
                });
        }
};

exports.GetPath = function() {
        return __dirname + "/../picture/";
};

var fs = require("fs");

function InvokeOnestepSolver() {
        var partid = 0;
        var model = mesh.shell.GetInterface();

        comx.mesh.Flatten(model, partid, 0, '', false, (step, msg) => {});
}

function generateThicknessPlot() {

        var thicknessCachePath = process.env.COMX_SDK + "data/thickness.cache";
        var plotCoordsPath = process.env.COMX_SDK + "data/coords.cache";

        var coords = JSON.parse(fs.readFileSync(plotCoordsPath, 'utf-8'));
        var thickness = JSON.parse(fs.readFileSync(thicknessCachePath, 'utf-8'));

        var ret = unit.form.mainfrm.GL.createPlotBuffer(coords, thickness);

        return ret;
}

exports.InvokeOnestepSolver = InvokeOnestepSolver;
exports.GenerateThicknessPlot = generateThicknessPlot;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// AutoLoadPlugins Function Implement Start.

function AutoLoadPlugins() {
        var plugin_dir = (__dirname + '/../addon/');
        if (!fs.existsSync(plugin_dir)) {
                return;
        }

        var files = fs.readdirSync(plugin_dir);
        files.forEach(function(filename) {
                var filedir = path.join(plugin_dir, filename);
                var stats = fs.statSync(filedir);
                if (!stats.isDirectory()) {
                        if (filedir.indexOf('-linux.node') != -1 && require('os').platform() == 'linux') {
                                require(filedir);
                        }

                        if (filedir.indexOf('-win.node') != -1 && require('os').platform() == 'win32') {
                                require(filedir);
                        }
                }
        });
}

function AutoLoadGlobalPlugins() {
        var plugin_dir = (process.env.COMX_SDK + 'addon/');
        if (!fs.existsSync(plugin_dir)) {
                return;
        }

        var files = fs.readdirSync(plugin_dir);
        files.forEach(function(filename) {
                var filedir = path.join(plugin_dir, filename);
                var stats = fs.statSync(filedir);
                if (!stats.isDirectory()) {
                        if (filedir.indexOf('-linux.node') != -1 && require('os').platform() == 'linux') {
                                require(filedir);
                        }

                        if (filedir.indexOf('-win.node') != -1 && require('os').platform() == 'win32') {
                                require(filedir);
                        }
                }
        });
}

//AutoLoadPlugins Function Implement End.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ide_info Function Implement Start.

exports.ide_info = (msg) => {
        if (process.send) {
                process.send({
                        type: 'debug',
                        info: msg
                });
        }
};

//ide_info Function Implement End.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
