/* global __dirname, require, process, it */
'use strict';

var pkg = require('../package.json'),
  myObject = require('../index.js'),
  TU = require('rd-tu'),
  fs = require('fs'),
  path = require('path');

// Données de test
var docObject = require('./dataset/in/docObject.sample.json'),
  dataset = {
    "paths": require('./dataset/in/data/paths.json'),
    "resources": require('./dataset/in/data/resources.json'),
    "files": require('./dataset/in/data/files.json'),
    "enrichments": require('./dataset/in/data/enrichments.json'),
    "XML": require('./dataset/in/data/XML.json'),
    "URL": require('./dataset/in/data/URL.json'),
    // "services": require('./dataset/in/data/services.json')
  };

// Mapping indiquant quelle fonction de test et quelles données utiliser pour chaque fonction
var wrapper = {
  "paths": {
    "init": testOf_pathsInit
  },
  "resources": {
    "require": testOf_resourcesRequire
  },
  "files": {
    "createPath": null,
    "get": testOf_fileRepresentation,
    "select": testOf_fileRepresentation,
    "selectAll": testOf_fileRepresentation
  },
  "enrichments": {
    "save": testOf_enrichmentsSave,
    "write": testOf_enrichmentsWrite
  },
  "XML": {
    "load": testOf_xmlLoad
  },
  "URL": {
    "addParameters": testOf_urlAddParameters
  },
  // "services": {
  //   "post": testOf_servicesPost,
  //   "transformXML": testOf_servicesTransformXML
  // }
};

/**
 * Test de chaques fonctions de :
 * - myObject.paths.
 *   - init()
 *
 * - myObject.resources.
 *   - require()
 *
 * - myObject.files.
 *   - selectAll()
 *   - select()
 *   - get()
 *   - createPath()
 *
 * - myObject.enrichments.
 *   - write()
 *   - save()
 *
 * - myObject.XML.
 *   - load()
 *   - select()
 *
 * - myObject.URL.
 *   - addParameters()
 */
TU.start({
  description: pkg.name + '/index.js',
  root: 'myObject',
  object: myObject,
  dataset: dataset,
  wrapper: wrapper
});

/**
 * Fonction de test à appliquée pour :
 * - myObject.paths.init()
 */
function testOf_pathsInit(fn, item, cb) {
  var result = fn(item.arguments.paths, item.arguments.root);
  return cb(result.test);
}

/**
 * Fonction de test à appliquée pour :
 * - myObject.resources.require()
 */
function testOf_resourcesRequire(fn, item, cb) {
  var paths = myObject.paths.init(item.arguments.paths, __dirname);
  return cb(fn(paths));
}

/**
 * Fonction de test à appliquée pour :
 * - myObject.files.selectAll()
 * - myObject.files.select()
 * - myObject.files.get()
 */
function testOf_fileRepresentation(fn, item, cb) {
  if (item.regExp) setRegex(item.regExp, item.arguments.options);
  return cb(fn(docObject[item.container], item.arguments.options));
}

/**
 * Fonction de test à appliquée pour :
 * - myObject.enrichments.save()
 */
function testOf_enrichmentsSave(fn, item, cb) {
  var before = (item.arguments.enrichments && item.arguments.enrichments[item.arguments.options.label]) ? item.arguments.enrichments[item.arguments.options.label].length : 0, // Nombre d'enrichissement avant
    result = fn(item.arguments.enrichments, item.arguments.options),
    after = result[item.arguments.options.label].length; // Nombre d'enrichissement aprés
  return cb(after - before);
}

/**
 * Fonction de test à appliquée pour :
 * - myObject.enrichments.write()
 */
function testOf_enrichmentsWrite(fn, item, cb) {
  return fn(item.arguments.options, function(err) {
    return cb(err);
  });
}

/**
 * Fonction de test à appliquée pour :
 * - myObject.XML.load()
 */
function testOf_xmlLoad(fn, item, cb) {
  var xmlStr = fs.readFileSync(path.join(__dirname, item.path), 'utf-8');
  return cb(fn(xmlStr).html().length);
}

/**
 * Fonction de test à appliquée pour :
 * - myObject.URL.addParameters()
 */
function testOf_urlAddParameters(fn, item, cb) {
  return cb(fn(item.arguments.url, item.arguments.parameters));
}

/**
 * Fonction de test à appliquée pour :
 * - myObject.services.post()
 */
function testOf_servicesPost(fn, item, cb) {
  return fn(item.arguments.options, function(err, res) {
    return cb(err);
  });
}

/**
 * Fonction de test à appliquée pour :
 * - myObject.services.transformXML()
 */
function testOf_servicesTransformXML(fn, item, cb) {
  return fn(item.arguments.options, function(err, res) {
    return cb(res.code);
  });
}

// Set une regex pour chaque clée demandée
function setRegex(keys, options) {
  for (var i = 0; i < keys.length; i++) {
    if (options instanceof Array) {
      for (var j = 0; j < options.length; j++) {
        options[j][keys[i]] = new RegExp(options[j][keys[i]]);
      }
    } else {
      options[keys[i]] = new RegExp(options[keys[i]]);
    }
  }
}