/**
 * @ignore
 * load tpl from file in nodejs
 * @author yiminghe@gmail.com
 */
KISSY.add('xtemplate/nodejs', function (S, XTemplate) {
    var fs = require('fs');
    var cached = {};

    /**
     * load xtemplate from file on nodejs
     * @class KISSY.XTemplate.Nodejs
     * @singleton
     */
    return  {
        /**
         * load xtemplate module on nodejs and return xtemplate instance
         * @param {String} moduleName xtemplate module name
         * @param config xtemplate config object
         * @returns {KISSY.XTemplate} xtemplate instance
         */
        loadFromModuleName: function (moduleName, config) {
            config = S.merge(config, {
                cacheFile: 1
            });
            config.extname = config.extname || 'html';
            var loader = getLoader(config);
            config.name = moduleName;
            config.loader = loader;
            var tpl = loader(moduleName);
            delete config.extname;
            return new XTemplate(tpl, config);
        }
    };

    function getLoader(cfg) {
        var cacheFile = cfg.cacheFile;
        var extname = cfg.extname;
        return function (subTplName) {
            if (cacheFile && cached[subTplName]) {
                return cached[subTplName];
            }
            var module = new S.Loader.Module({
                name: subTplName,
                type: extname,
                runtime: S
            });

            var tpl = fs.readFileSync(new S.Uri(module.getFullPath()).getPath(), {
                encoding: 'utf-8'
            });
            if (cacheFile) {
                cached[subTplName] = tpl;
            }
            return tpl;
        }
    }
}, {
    requires: ['xtemplate']
});