text: 'use strict';
  
  const protagonist = require('protagonist');
  const fs = require('fs');
  const P = require('bluebird');
  const _ = require('lodash');
  const chalk = require('chalk');
  const Handlebars = require('handlebars');
  const util = require('util');
  const path = require('path');
  
  P.promisifyAll(fs);
  P.promisifyAll(protagonist);
  
  const angualarModuleName = 'xos.helpers'
  
  // format href in angular format
  const formatHref = url => url.replace('{', ':').replace('}', '');
  
  const formatTitle = title => title.split(' ').join('-');
  
  const getParamName = url => url.match(/\{([^)]+)\}/) ? url.match(/\{([^)]+)\}/)[1] : '';
  
  // Get Group description
  const getGroupDescription = (group) => _.find(group, {element: 'copy'}) ? _.find(group, {element: 'copy'}).content.replace(/\n$/, '') : '';
  
  // Loop APIs endpoint
  const loopApiEndpoint = (group) => {
    // {name: 'ResourceName', attributes: {href: '/ahhsiiis'}}
    _.remove(group, {element: 'copy'})
    // console.log(group);
    // _.forEach(group, d => console.log(d));
  
    return _.map(group, g => {
      return {
        name: formatTitle(g.meta.title),
        param: {href: formatHref(g.attributes.href), name: getParamName(g.attributes.href)},
      }
    })
  };
  
  // Loop APIs groups
  const loopApiGroups = (defs) => {
    if (!Array.isArray(defs)) {
      return;
    }
    _.forEach(defs, d => {
      console.info(chalk.blue.bold(`Parsing Group: ${d.meta.title}`));
      var data = {
        description: getGroupDescription(d.content),
        ngModule: angualarModuleName,
        resources: loopApiEndpoint(d.content)
      };
      fs.writeFileSync(path.join(__dirname, `../xosHelpers/src/services/rest/${formatTitle(d.meta.title)}.js`), handlebarsTemplate(data));
    });
  
    console.info(chalk.green.bold(`Api Generated`));
  
  };
  
  // Loop the top level definitions
  const loopApiDefinitions = (defs) => {
    // console.log(util.inspect(defs, false, null));
    _.forEach(defs, d => loopApiGroups(d.content));
  };
  
  let handlebarsTemplate;
  
  // read blueprint docs and parse
  fs.readFileAsync(path.join(__dirname, './ngResourceTemplate.handlebars'), 'utf8')
  .then((template) => {
    handlebarsTemplate = Handlebars.compile(template);
    return fs.readFileAsync(path.join(__dirname, '../../../xos/tests/api/apiary.apib'), 'utf8')
  })
  .then(data => protagonist.parseAsync(data))
  .then(result => loopApiDefinitions(result.content))
  .catch(console.warn);
  
  