module.exports = {

  /**
   * @method generateXml
   * Generate the XML for the winsw configuration file.
   * @param {Object} config
   * The config object must have the following attributes:
   *
   * - *id* This is is how the service is identified. Alphanumeric, no spaces.
   * - *name* The descriptive name of the service.
   * - *script* The absolute path of the node.js script. i.e. `C:\path\to\myService.js`
   *
   * Optional attributes include
   *
   * - *description* The description that shows up in the service manager.
   * - *flags* Any flags that should be passed to node. Defaults to `--harmony` to add ES6 support.
   * - *logmode* Valid values include `rotate` (default), `reset` (clear log), `roll` (move to .old), and `append`.
   * - *logpath* The absolute path to the directory where logs should be stored. Defaults to the current directory.
   * - *dependencies* A comma delimited list or array of process dependencies.
   * - *env* A key/value object or array of key/value objects containing
   * environment variables to pass to the process. The object might look like `{name:'HOME',value:'c:\Windows'}`.
   */
  generateXml: function(config){

    // Set default values
    config = config || {};
    config.description = config.description || '';
    config.flags = config.flags || '--harmony';
    config.logmode = 'rotate';

    // Initial template
    var xml = '<service><id>'
            +config.id
            +'</id><name>'
            +config.name
            +'</name><description>'
            +config.description
            +'</description><executable>node.exe</executable><arguments>'
            +config.flags
            +' '+config.script
            +'</arguments><logmode>'
            +config.logmode
            +'</logmode>';

    // Optionally add log path
    if (config.logpath) {
      xml += '<logpath>'+config.logpath+'</logpath>';
    }

    // Optionally add service dependencies
    if (config.dependencies){
      config.dependencies = (config.dependencies instanceof Array == true) ? config.dependencies : config.dependencies.split(',');
      config.dependencies.forEach(function(dep){
        xml += '<depend>'+dep.trim()+'</depend>';
      });
    }

    // Optionally add environment values
    if (config.env){
      config.env = (config.env instanceof Array == true) ? config.env : [config.env];
      config.env.forEach(function(env){
        xml += '<env name="'+env.name+'" value="'+env.value+'" />';
      });
    }

    xml += "</service>";

    return xml;
  },

  /**
   * @method createExe
   * Create the executable
   * @param {String} name
   * The alphanumeric string (spaces are stripped) of the `.exe` file. For example, `My App` generates `myapp.exe`
   * @param {String} [dir=cwd]
   * The output directory where the executable will be saved.
   * @param {Function} [callback]
   * The callback to fire upon completion.
   */
  createExe: function(name,dir,callback){
    var fs = require('fs'), p = require('path');

    if (typeof dir === 'function'){
      callback = dir;
      dir = null;
    }

    dir = dir || process.cwd();

    var origin = p.join(__dirname,'..','bin','winsw','x'+(require('os').arch().indexOf('64')>0 ? '64':'86'),'winsw.exe'),
        dest = p.join(dir,name.replace(/[^\w]/gi,'').toLowerCase()+'.exe'),
        data = fs.readFileSync(origin,{encoding:'binary'});

    fs.writeFileSync(dest,data,{encoding:'binary'});
    callback && callback();
    //require('child_process').exec('Icacls "'+dest+'" /grant Everyone:(F)',callback)
    //require('child_process').exec('copy "'+origin+'" /y /v /b "'+dest+'" /b',callback);
  }

}