const { MessageContext } = require('fluent');

function toJSON(map) {
  return JSON.stringify(Array.from(map));
}

module.exports = function(source) {
  const localeExp = this.options.locale || /([^/]+)\/[^/]+\.ftl$/;
  const result = localeExp.exec(this.resourcePath);
  const locale = result && result[1];
  // pre-parse the ftl
  const context = new MessageContext(locale);
  context.addMessages(source);
  if (!locale) {
    throw new Error(`couldn't find locale in: ${this.resourcePath}`);
  }
  return `
module.exports = \`
if (typeof window === 'undefined') {
  var fluent = require('fluent');
}
var ctx = new fluent.MessageContext('${locale}', {useIsolating: false});
ctx._messages = new Map(${toJSON(context._messages)});
function translate(id, data) {
  var msg = ctx.getMessage(id);
  if (typeof(msg) !== 'string' && !msg.val && msg.attrs) {
    msg = msg.attrs.title || msg.attrs.alt
  }
  return ctx.format(msg, data);
}
if (typeof window === 'undefined') {
  module.exports = translate;
}
else {
  window.translate = translate;
}
\``;
};