var nodejieba = require( __dirname + "/build/Release/nodejieba.node");
nodejieba.DEFAULT_DICT = __dirname + "/dict/jieba.dict.utf8";
nodejieba.DEFAULT_HMM_DICT = __dirname + "/dict/hmm_model.utf8";
nodejieba.DEFAULT_USER_DICT = __dirname + "/dict/user.dict.utf8";
nodejieba.DEFAULT_IDF_DICT = __dirname + "/dict/idf.utf8";
nodejieba.DEFAULT_STOP_WORD_DICT = __dirname + "/dict/stop_words.utf8";

var isDictLoaded = false;

var someFunct = nodejieba.load;
nodejieba.load = function (dictJson) {
  if (!dictJson) {
    dictJson = {}
  }
  dict         = dictJson.dict       || nodejieba.DEFAULT_DICT;
  hmmDict      = dictJson.hmmDict    || nodejieba.DEFAULT_HMM_DICT;
  userDict     = dictJson.userDict   || nodejieba.DEFAULT_USER_DICT;
  idfDict      = dictJson.idfDict    || nodejieba.DEFAULT_IDF_DICT;
  stopWordDict = dictJson.stopWordDict || nodejieba.DEFAULT_STOP_WORD_DICT;

  isDictLoaded = true;
  return someFunct.call(this, dict, hmmDict, userDict, idfDict, stopWordDict);
};

function wrapWithDictLoad(obj, functName) {
  var someFunct = obj[functName];
  obj[functName] = function () {
    if (!isDictLoaded) {
      nodejieba.load();
    }
    return someFunct.apply(this, arguments);
  }
}

wrapWithDictLoad(nodejieba, "cut");
wrapWithDictLoad(nodejieba, "cutAll");
wrapWithDictLoad(nodejieba, "cutHMM");
wrapWithDictLoad(nodejieba, "cutForSearch");
wrapWithDictLoad(nodejieba, "cutSmall");
wrapWithDictLoad(nodejieba, "tag");
wrapWithDictLoad(nodejieba, "extract");
wrapWithDictLoad(nodejieba, "extractWithWords");
wrapWithDictLoad(nodejieba, "textRankExtract");
wrapWithDictLoad(nodejieba, "textRankExtractWithWords");
wrapWithDictLoad(nodejieba, "insertWord");

nodejieba.tagWordsToStr = function(words) {
    var result = '';
    for (var i = 0; i < words.length; i++) {
        result += words[i].word + '/' + words[i].tag + ' ';
    }
    return result.trim();
};

module.exports = nodejieba;