////////////////////////////////////////////////////////////////////////
// System API
////////////////////////////////////////////////////////////////////////
var SHELL = require("lib/shell");
var WSH = CreateObject("WScript.Shell");
var WMI =  require("lib/wmi");

exports.VERSIONINFO = "System Module (system.js) version 0.1";
exports.global = global;
exports.require = global.require;

exports.createProcess = function(cmd) {
    var SW_HIDE = 0;
    //wmi.Get("Win32_Process").Create(cmd, null, si, pid);
    return WMI.setClass("Win32_Process").setMethod("Create").setParameters({
        "CommandLine": cmd,
        "CurrentDirectory": null,
        "ProcessStartupInformation": WMI.setClass("Win32_ProcessStartup").create()
            .setAttribute("ShowWindow", SW_HIDE)
            .setAttribute("CreateFlags", 16777216)
            .setAttribute("X", 1)
            .setAttribute("Y", 1)
            .setAttribute("xSize", 1)
            .setAttribute("ySize", 1)
            .getInstance()
    }).execute().get("ProcessID");
};

exports.getEnvString = function(envName) {
    return WSH.ExpandEnvironmentStrings('%' + envName + '%');
};

exports.get32BitFolder = function() {
    var base = exports.getEnvString("WINDIR");
    var syswow64 = base + "\\SysWOW64\\";

    if (JPTUDBSTOW.FS.FolderExists(syswow64))
        return syswow64;

    return base + "\\System32\\";
}

exports.isElevated = function() {
    try {
        WSH.RegRead("HKEY_USERS\\s-1-5-19\\");
        return true;
    } catch (e) {
        return false;
    }
};

exports.getOS = function() {
    return WMI.execQuery("SELECT * FROM Win32_OperatingSystem").fetch().get("Caption").rtrim();
};

exports.getDCName = function() {
    try {
        var DC = WSH.RegRead("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\History\\DCName");
        if (DC.length > 0)
            return DC;
    } catch (e) {}
};

exports.getArch = function() {
    return WMI.execQuery("SELECT * FROM Win32_OperatingSystem").fetch().get("OSArchitecture");
};

exports.getUUID = function() {
    return WMI.execQuery("SELECT * FROM Win32_ComputerSystemProduct").fetch().get("UUID").toLowerCase();
};

exports.getCurrentWorkingDirectory = function() {
    try {
        cwd = SHELL.exec("cd", "cwd.txt").rtrim();
        return cwd;
    } catch (e) {}
};

exports.getDirName = function(path) {
    var delimiter = "\\";
    var pos = path.lastIndexOf(delimiter);
    return (pos > -1 ? path.substring(0, pos) : "");
};

exports.getFileName = function(path) {
    var delimiter = "\\";
    var pos = path.lastIndexOf(delimiter);
    return (pos > -1 ? path.substring(pos + delimiter.length) : "");
};

exports.getCurrentScriptDirectory = function() {
    if (typeof(WScript) !== "undefined") {
        return exports.getDirName(WScript.ScriptFullName);
    } else if (typeof(document) !== "undefined") {
        return exports.getDirName(document.location.pathname);
    } else {
        return ".";
    }
};

exports.getCurrentScriptName = function() {
    if (typeof(WScript) !== "undefined") {
        return WScript.ScriptName;
    } else if (typeof(document) !== "undefined") {
        return exports.getFileName(document.location.pathname);
    } else {
        return "";
    }
};

exports.getNetworkInterfaces = function() {
    return WMI.execQuery("SELECT * FROM Win32_NetworkAdapterConfiguration").fetchAll();
};

exports.getProcessList = function() {
    return WMI.execQuery("Select * From Win32_Process").fetchAll();
};

exports.getPIDList = function() {
    var result = [];
    var processes = exports.getProcessList();
    for (var i = 0; i < processes.length; i++) {
        result.push(processes[i].ProcessID);
    }
    return result;
};

exports.isAlivePID = function(pid) {
    if (!pid) {
        return false;
    } else {
        return (exports.getPIDList().indexOf(pid) > -1);
    }
};

exports.getProcessListByName = function(name) {
    return exports.getProcessList().filter(function(s) {
        return (s.Caption === name);
    });
};

exports.killProcess = function(pid) {
    var processes = exports.getProcessList();

    for (var i = 0; i < processes.length; i++) {
        try {
            if (processes[i].ProcessId == pid) {
                processes[i].Terminate();
                return true;
            }
        } catch (e) {
            console.error("Lib -> System -> killProcess() -> ", e.message);
        }
    }

    return false;
};

exports.createShortcut = function(shoutcutName, fileName) {
    var workingDirectory = exports.getCurrentWorkingDirectory();
    var desktopPath = WSH.SpecialFolders("Desktop");
    var link = WSH.CreateShortcut(desktopPath + "\\" + shoutcutName + ".lnk");
    link.IconLocation = fileName + ",1";
    link.TargetPath = workingDirectory + "\\" + fileName;
    link.WindowStyle = 1;
    link.WorkingDirectory = workingDirectory;
    link.Save();
};

exports.ping = function(address) {
    return WMI.execQuery("Select * From Win32_PingStatus where address='" + address + "'").fetch().get("ResponseTime");
};