import { cook as cookIt, setup as setupIt } from 'pretty-text/engines/discourse-markdown-it';

export function registerOption() {
  // TODO next major version deprecate this
  // if (window.console) {
  //   window.console.log("registerOption is deprecated");
  // }
}

export function buildOptions(state) {
  const {
    siteSettings,
    getURL,
    lookupAvatar,
    getTopicInfo,
    topicId,
    categoryHashtagLookup,
    userId,
    getCurrentUser,
    currentUser,
    lookupAvatarByPostNumber,
    emojiUnicodeReplacer,
    lookupInlineOnebox,
    lookupImageUrls,
    previewing,
    linkify,
    censoredWords
  } = state;

  let features = {
    'bold-italics': true,
    'auto-link': true,
    'mentions': true,
    'bbcode': true,
    'quote': true,
    'html': true,
    'category-hashtag': true,
    'onebox': true,
    'linkify': linkify !== false,
    'newline': !siteSettings.traditional_markdown_linebreaks
  };

  if (state.features) {
    features = _.merge(features, state.features);
  }

  const options = {
    sanitize: true,
    getURL,
    features,
    lookupAvatar,
    getTopicInfo,
    topicId,
    categoryHashtagLookup,
    userId,
    getCurrentUser,
    currentUser,
    lookupAvatarByPostNumber,
    mentionLookup: state.mentionLookup,
    emojiUnicodeReplacer,
    lookupInlineOnebox,
    lookupImageUrls,
    censoredWords,
    allowedHrefSchemes: siteSettings.allowed_href_schemes ? siteSettings.allowed_href_schemes.split('|') : null,
    markdownIt: true,
    previewing
  };

  // note, this will mutate options due to the way the API is designed
  // may need a refactor
  setupIt(options, siteSettings, state);

  return options;
}

export default class {
  constructor(opts) {
    if (!opts) {
      opts = buildOptions({ siteSettings: {}});
    }
    this.opts = opts;
  }

  disableSanitizer() {
    this.opts.sanitizer = this.opts.discourse.sanitizer = ident => ident;
  }

  cook(raw) {
    if (!raw || raw.length === 0) { return ""; }

    let result;
    result = cookIt(raw, this.opts);
    return result ? result : "";
  }

  sanitize(html) {
    return this.opts.sanitizer(html).trim();
  }
};